Mysql 我需要按列排序的索引吗?
我们有这样一个查询:Mysql 我需要按列排序的索引吗?,mysql,sql,indexing,Mysql,Sql,Indexing,我们有这样一个查询: select * from foo where some_fk_id = <value> and modified_date > 'date1' and modified_date < 'date2' order by modified_date desc; 选择* 来自富 其中某些\u fk\u id= 并修改了_date>“date1” 和修改日期
select *
from foo
where some_fk_id = <value>
and modified_date > 'date1'
and modified_date < 'date2'
order by modified_date desc;
选择*
来自富
其中某些\u fk\u id=
并修改了_date>“date1”
和修改日期<'date2'
按修改日期说明订购;
在上述场景中,我是否需要为
某些\u fk\u id
和修改的\u date
创建一个复合索引?不适用于ORDER BY-选择行后应用于结果集。如果您定期选择基于修改的日期,您可能需要考虑一个。
顺便说一句,您提供的语句在修改日期选择两个不同的值。这应该是一个'>'和一个',这取决于您的数据,但是基于修改日期的索引可能对where和orderby都有好处 如果外键条件只给您几行,那么以任何方式按日期对行进行排序都是很便宜的。您不需要复合索引,但如果您这样做,则可以单独使用索引(即非常快)满足
某些fk\u id
和修改的\u日期
where子句
最好的做法是查看查询计划并进行概要分析
您可以使用EXPLAIN
查看查询计划:
EXPLAIN SELECT * FROM foo WHERE some_fk_id=1 AND modified_date > 'date1' AND modified_date < 'date2' ORDER BY modified_date DESC;
EXPLAIN SELECT*FROM foo,其中某些\u fk\u id=1和修改的\u date>“date1”和修改的\u date<“date2”按修改的\u date DESC排序;
在有或没有综合指数的情况下都可以尝试一下,看看它会有什么样的计划。可能发生的最糟糕的事情是文件排序
——如果你需要加快速度,尽量避免这些
最重要的是,对实际使用的查询、数据和硬件进行运行时测试。在您的特定情况下,复合索引占用的空间可能会使您的速度减慢,而不仅仅是搜索条目。例如,如果某个_fk_id在表中具有很高的选择性,则可能不需要第二级索引。它正在执行文件排序,如何避免上述命令出现这种情况?我将尝试使用索引并更新您。select中的*将减少拥有索引的值,因为您的查询仍需要执行键查找以获取其余值。但如果有索引的话,速度应该会更快。最好显式列出要返回的列,并在创建索引时在INCLUDE子句中列出它们。