为什么MySQL在这种情况下使用filesort?

Hyd*_*erA 5 mysql sql optimization performance

表结构:

CREATE TABLE IF NOT EXISTS `newsletters` 
(
    `id` int(11) NOT NULL auto_increment,
    `last_update` int(11) default NULL,
    `status` int(11) default '0',
    `message_id` varchar(255) default NULL,
    PRIMARY KEY  (`id`),
    KEY `status` (`status`),
    KEY `message_id` (`message_id`),
    KEY `last_update` (`last_update`)
) 
ENGINE=MyISAM DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT id, last_update
FROM newsletters
WHERE status = 1
ORDER BY last_update DESC 
LIMIT 0, 100
Run Code Online (Sandbox Code Playgroud)
  • newsletters表有超过300万条记录
  • 查询需要超过26秒才能执行

查询说明:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  newsletters range   status  status  5   NULL    3043354 Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)

那么为什么它不使用filesort,它是如何range查询的呢?

And*_*mar 5

它正在filesort用于排序last_update.您可以通过更改索引来避免使用的文件status, last_update排序,以便MySQL以正确的顺序查找状态为1的所有行.

要进一步优化,请将索引更改为status, last_update, id.这允许MySQL仅通过查看索引来满足查询,而无需查找表.

CREATE INDEX idx_newsletters_status
ON newsletters(status, last_update, id);
Run Code Online (Sandbox Code Playgroud)