表格结构:
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万条记录 查询解释:
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
查询的呢?
答案 0 :(得分: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);