我有一个非常简单的SELECT,它可以转换为filesort并且不使用索引。
考虑以下问题:
SELECT * FROM forum_topic
WHERE topic_status = 0
ORDER BY modified_date LIMIT 0, 30
在下表中(剥离了几列以使其更加简洁)
CREATE TABLE `forum_topic` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`slug` varchar(255) NOT NULL,
`forum_id` int(10) NOT NULL DEFAULT '1',
`title` varchar(100) NOT NULL,
`topic_status` tinyint(1) NOT NULL DEFAULT '0',
`post_count` bigint(20) NOT NULL DEFAULT '0',
`modified_date` datetime NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `slug` (`slug`),
FULLTEXT KEY `title` (`title`),
KEY `modified` (`modified_date`, `topic_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
EXPLAIN提供以下输出
id select_type table? partitions? type? possible_keys? key? key_len? ref? rows? Extra?
1 SIMPLE forum_topic NULL ALL NULL NULL NULL NULL 2075 Using where; Using filesort
请注意解释如何解释possible_keys是否为NULL以及扫描所有行后如何使用filesort。
请指教。感谢。
答案 0 :(得分:0)
此查询需要topic_status
出现在索引的最重要位置,因为它正在搜索常量。
你有
KEY `modified` (`modified_date`, `topic_status`)
你可能想要
KEY `mod2` (`topic_status`, `modified_date` )
代替。这可能同时满足过滤器和查询的ORDER BY ... LIMIT
部分。
专业提示:避免使用SELECT *
并枚举您实际需要的列。
专业提示:Filesort并不一定意味着您的意思。它可以在MySQL需要构建中间结果集的任何时候使用,例如排序。