2011-12-05 25 views
0

我们有一个查询这是这样的:我是否需要ORDER BY列上的索引?

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一个综合指数?

+1

您选择的*会减少拥有索引的值,因为您的查询仍然需要执行密钥查找以获取剩余的值。但是,索引应该更快。最好明确列出要返回的列,并在创建索引时将它们列在INCLUDE子句中。 – sfuqua

回答

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在表中具有非常高的选择性,则可能不需要二级索引。

+0

它正在执行一个文件夹,我如何避免上述命令?我会尝试使用索引并更新你 – priya

0

不适用于ORDER BY - 适用于结果集行被选中。如果您定期基于modified_date进行选择,则可能需要考虑其中一项。

顺便说一下,您提供的语句选择modified_date>两个不同的值。那应该是一个'>'和一个'<'?

+0

是的,我已经修改了我的问题 - 对于输入错误 – priya

0

这取决于您的数据,但是对于modified_date的索引可能对于位置和顺序都是有益的。

如果外键条件只给你几行,那么以任何方式按日期排列行将很便宜。

+0

好的,我会试试这个 – priya

相关问题