MySQL 并不总是使用具有相同查询的键

Posted

技术标签:

【中文标题】MySQL 并不总是使用具有相同查询的键【英文标题】:MySQL doesn't always use a key with the same query 【发布时间】:2018-01-03 19:19:50 【问题描述】:

我有一张桌子:

CREATE TABLE `myTable` (
`a` DECIMAL(8,3) NULL DEFAULT NULL,
`b` INT(11) NULL DEFAULT NULL,
`name` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`id` INT(11) NOT NULL AUTO_INCREMENT,
`plus` VARCHAR(100) NOT NULL DEFAULT 't' COLLATE 'utf8_unicode_ci',
PRIMARY KEY (`id`),
INDEX `myKey` (`a`, `b`, `name`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2416682;

我运行一个查询:

SELECT * FROM myTable 
order by a, b, name
limit 10000, 8 ;

速度很慢,大约需要两秒钟。

如果我运行解释,它会返回:

        'id' => 1,
        'select_type' => 'SIMPLE',
        'table' => 'myTable ',
        'partitions' => NULL,
        'type' => 'ALL',
        'possible_keys' => NULL,
        'key' => NULL,
        'key_len' => NULL,
        'ref' => NULL,
        'rows' => 1759263,
        'filtered' => 100.00,
        'Extra' => 'Using filesort',

现在,如果我将限制设置为较低的值,它会变得非常快,并解释说它使用 myKey:

SELECT * FROM myTable 
order by a, b, name
limit 1000, 8 ;

解释:

        'id' => 1,
        'select_type' => 'SIMPLE',
        'table' => 'myTable',
        'partitions' => NULL,
        'type' => 'index',
        'possible_keys' => NULL,
        'key' => 'myKey',
        'key_len' => '779',
        'ref' => NULL,
        'rows' => 1008,
        'filtered' => 100.00,
        'Extra' => NULL,

当限制的数字很大时,我该怎么做才能使选择更快?

我很惊讶该密钥并非一直都在使用,与限制值无关。这正常吗?

mysql 版本是 5.7.20-log。

谢谢

【问题讨论】:

【参考方案1】:

您可以通过执行以下操作来强制使用索引:

FORCE INDEX (myKey) 

FORCE INDEX mySQL ...where do I put it?

【讨论】:

谢谢,效果很好!现在的问题是,如果我在选择中写入一个高数字(例如:limit 1000000, 8),则选择大约需要两秒钟。即使使用了密钥。有没有办法让它更快? 其实不知道,我得测试一下。如果我帮助了你,请考虑接受我的回答:) 我已经尝试过这样做,但我只有 6 个声望,我需要 15 个才能以可显示的方式投票。但即将到来的对话告诉我,我的投票被记录了。我想当我达到 15 名声望时它会被计算在内。

以上是关于MySQL 并不总是使用具有相同查询的键的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询优化

由于某种原因,ProxySQL 查询缓存并不总是遵守查询规则

Cassandra 并不总是在单个数据中心返回相同查询的预期数据,设置 5 个副本

让MySQL查询更加高效——对查询进行重构

Mysql:查询在具有相同配置的另一台 PC 上不起作用

有没有办法避免在 Apollo GraphQL 中返回具有空值的键?