说我有这样一个简单的查询:
SELECT * FROM topics ORDER BY last_post_id DESC
根据MySQL's Order-By Optimization Docs,应使用last_post_id
的索引。但EXPLAIN
查询却反过来说:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE topic_info ALL NULL NULL NULL NULL 13 Using filesort
为什么我的索引没有被使用?
答案 0 :(得分:2)
你真的只有13行吗?数据库可能正在决定简单地对它们进行排序比通过索引更快。
答案 1 :(得分:2)
索引优化的基本原则是使用代表性数据进行测试。表中的几行没有关于索引或优化器在现实生活中如何工作的预测值。
如果你真的只有几条记录,那么索引将没有提供任何有效的好处。
答案 2 :(得分:1)
EXPLAIN只告诉你选择过程,在这种情况下,预计查询必须检查所有13行,看看它们是否符合WHERE子句(你没有,所以它是无用的信息!)。它仅报告用于此目的的索引和键(评估WHERE,JOIN,HAVING)。因此,无论查询是否使用索引进行排序,EXPLAIN都不会告诉您,因此不要陷入其结果中。
是的,查询使用索引快速排序。我注意到来自EXPLAIN的相同结果(尽管按照索引排序并且有限制,也报告所有行)并且我怀疑它是由于表中的行数少而导致的,而是限制了EXPLAIN的功能
答案 3 :(得分:-3)
尝试按照表中的顺序选择特定列。订单发生变化时,MySQL索引不成立。