MySQL指数和按条款订购

时间:2009-03-08 04:30:46

标签: mysql

说我有这样一个简单的查询:

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

为什么我的索引没有被使用?

4 个答案:

答案 0 :(得分:2)

你真的只有13行吗?数据库可能正在决定简单地对它们进行排序比通过索引更快。

答案 1 :(得分:2)

索引优化的基本原则是使用代表性数据进行测试。表中的几行没有关于索引或优化器在现实生活中如何工作的预测值。

如果你真的只有几条记录,那么索引将没有提供任何有效的好处。

答案 2 :(得分:1)

EXPLAIN只告诉你选择过程,在这种情况下,预计查询必须检查所有13行,看看它们是否符合WHERE子句(你没有,所以它是无用的信息!)。它仅报告用于此目的的索引和键(评估WHERE,JOIN,HAVING)。因此,无论查询是否使用索引进行排序,EXPLAIN都不会告诉您,因此不要陷入其结果中。

是的,查询使用索引快速排序。我注意到来自EXPLAIN的相同结果(尽管按照索引排序并且有限制,也报告所有行)并且我怀疑它是由于表中的行数少而导致的,而是限制了EXPLAIN的功能

答案 3 :(得分:-3)

尝试按照表中的顺序选择特定列。订单发生变化时,MySQL索引不成立。