开发者

Why is MySQL using filesort in this case?

开发者 https://www.devze.com 2023-03-07 08:04 出处:网络
Table Structure: CREATE TABLE IF NOT EXISTS `newsletters` ( `id` int(11) NOT NULL auto_increment, `last_update` int(11) default NULL,

Table Structure:

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` (`开发者_JAVA技巧status`),
    KEY `message_id` (`message_id`),
    KEY `last_update` (`last_update`)
) 
ENGINE=MyISAM DEFAULT CHARSET=latin1;

The Query:

SELECT id, last_update
FROM newsletters
WHERE status = 1
ORDER BY last_update DESC 
LIMIT 0, 100
  • newsletters table has over 3 million records
  • query takes over 26 seconds to execute

Query explain:

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

So why is it not using filesort, and how is it a range query?


It's using filesort to sort on last_update. You can avoid the filesort that by changing the index to status, last_update, so MySQL finds all rows with status 1 in the right order.

To further optimize, change the index to status, last_update, id. That allows MySQL to satisfy the query just by looking at the index, without a table lookup.

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

精彩评论

暂无评论...
验证码 换一张
取 消