代码之家  ›  专栏  ›  技术社区  ›  moo

MySQL索引和ORDERBY子句

  •  0
  • moo  · 技术社区  · 17 年前

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

    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 回复  |  直到 17 年前
        1
  •  2
  •   MandyK    17 年前

        2
  •  2
  •   dkretz    17 年前

    指标优化的一个基本原则是使用代表性数据进行测试。表中的几行对于索引或优化器在现实生活中的工作方式没有预测价值。

    如果您确实只有少数记录,那么索引将不会提供有效的好处。

        3
  •  1
  •   qpingu    17 年前

    EXPLAIN只告诉您有关选择过程的信息,在这种情况下,查询需要检查所有13行,看看它们是否符合WHERE子句(您没有WHERE子句,因此这是无用的信息!)。它只报告用于此目的的索引和键(计算WHERE、JOIN、have)。因此,无论查询是否使用索引进行排序,EXPLAIN都不会告诉您,因此不要被其结果所困扰。

    是的,查询使用索引快速排序。我注意到EXPLAIN也有相同的结果(即报告所有行,尽管按索引排序并有限制),我怀疑这是因为表中的行数很少,而是EXPLAIN功能的限制。

        4
  •  -3
  •   achinda99    17 年前

    尝试按特定列在表中的顺序选择它们。更改顺序时,MySQL索引不起作用。