MySQL 并不总是在相同的查询中使用一个键

标签 mysql

我有一张 table :

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,

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

令我惊讶的是,该 key 并未一直使用,与限制值无关。这正常吗?

MySQL版本是5.7.20-log。

谢谢

最佳答案

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

FORCE INDEX (myKey) 

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

关于MySQL 并不总是在相同的查询中使用一个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48083815/

相关文章:

php - 使用 PHP distinct 从 mysql 中获取所有唯一数据

php - 在 MySQL 中获取给定月份的记录?

mysql - mysql 中事件触发了多少次

mysql - 如何在创建查询中将变量设置为表名

php - 如何从PHP中的URL获取多个同名参数并将所有记录插入表中

python - 如何添加额外的列参数以从收件箱 gammu 插入到 Sentitems 上?

mysql - 根据指定的日期范围在另一列中循环生成字符串值

mysql - 如何对下表进行连接操作?

php - 如何从mysql库中选择第一条记录之后的第二条记录

MySQL更新问题