我是否需要ORDER BY列的索引?

时间:2011-12-05 06:11:23

标签: mysql sql indexing

我们有一个查询,如下所示:

select *
  from foo
 where some_fk_id = <value>
   and modified_date > 'date1'
   and modified_date < 'date2'
 order by modified_date desc;

我是否需要在上述方案中为some_fk_idmodified_date创建综合索引?

3 个答案:

答案 0 :(得分:0)

不适用于ORDER BY - 在选择行之后应用于结果集。如果您定期根据modified_date进行选择,则可能需要考虑一个。

BTW,您提供的语句选择modified_date&gt;两个不同的值。这应该是一个'&gt;'和一个'&lt;'?

答案 1 :(得分:0)

这取决于你的数据,但是对于where_和order by,modified_date上的索引可能会很好。

如果外键条件只给你几行,那么以任何方式按行排序都会很便宜。

答案 2 :(得分:0)

你不需要一个复合索引,但是如果你这样做的话,只需要索引(即非常快)就可以满足some_fk_idmodified_date where子句。

最好的办法是查看查询计划和个人资料。

您可以使用EXPLAIN

查看查询计划
EXPLAIN SELECT * FROM foo WHERE some_fk_id=1 AND modified_date > 'date1' AND modified_date < 'date2' ORDER BY modified_date DESC;

尝试使用和不使用复合索引,并查看它的计划。可能发生的最糟糕的事情是filesort - 如果你需要快速的话,尽量避免这些。

最重要的是,使用您实际使用的查询,数据和硬件进行运行时间试验。在您的特定情况下,复合索引占用的空间可能会减慢您的速度,而不仅仅是搜索条目。例如,如果some_fk_id在表中具有非常高的选择性,则可能不需要第二级索引。