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

时间:2011-05-22 08:09:57

标签: mysql sql performance optimization

表格结构:

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;

查询:

SELECT id, last_update
FROM newsletters
WHERE status = 1
ORDER BY last_update DESC 
LIMIT 0, 100
  • 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

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

1 个答案:

答案 0 :(得分:5)

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

要进一步优化,请将索引更改为status, last_update, id。这样,MySQL就可以通过查看索引来满足查询,而无需查找表。

CREATE INDEX idx_newsletters_status
ON newsletters(status, last_update, id);