我有一张 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。
谢谢
最佳答案
关于MySQL 并不总是在相同的查询中使用一个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48083815/