多列索引是否适用于单列选择?

Geo*_*lly 43 sqlite indexing

我(例如)有一个索引:

CREATE INDEX someIndex ON orders (customer, date);
Run Code Online (Sandbox Code Playgroud)

此索引是否仅加速使用客户和日期的查询,还是加速了像这样的单列查询?

SELECT * FROM orders WHERE customer > 33;
Run Code Online (Sandbox Code Playgroud)

我正在使用SQLite.


如果答案是肯定的,为什么每个表可以创建多个索引?


还有一个问题:当您在查询中使用两个列时,组合索引与两个分离索引相比要快多少?

Jar*_*ler 38

marc_s对你的第一个问题有正确的答案.多键索引中的第一个键可以像单个键索引一样工作,但任何后续键都不会.

至于复合索引的速度有多快取决于您的数据以及如何构建索引和查询,但这通常很重要.索引基本上允许Sqlite对字段进行二进制搜索.

使用您在运行查询时提供的示例:

SELECT * from orders where customer > 33 && date > 99
Run Code Online (Sandbox Code Playgroud)

Sqlite将首先使用二进制搜索在客户> 33的整个表上获得所有结果.然后,它将仅对那些查找日期> 99的结果进行二进制搜索.

如果您在客户和日期上使用两个单独的索引执行相同的查询,则Sqlite必须二次搜索整个表,首先是客户,再次是日期.

因此,您将看到多少速度增加取决于您根据查询构建索引的方式.理想情况下,索引中的第一个字段和查询应该是消除最可能匹配的字段,因为这将通过大大减少第二次搜索必须执行的工作量来提高速度.

有关更多信息,请参阅:http: //www.sqlite.org/optoverview.html

  • 如果第一列是不等式表达式(例如,客户> 33),SQLite将不使用索引的第二列.(大多数数据库引擎都很难). (5认同)
  • 如果您创建两个单独的索引,则仅使用其中一个,另一个表达式将根据第一个索引生成的结果集进行计算。(在 Oracle 上,如果优化是基于成本并且满足某些条件,那么它_可以_执行两个索引搜索并交叉结果集,但这是一种罕见的情况)。 (2认同)

mar*_*c_s 6

我很确定这会起作用,是的 - 无论如何它都适用于MS SQL Server.

但是,如果您只需要选择日期,例如日期范围,则此索引不会对您有所帮助.在这种情况下,您可能需要仅在日期上创建第二个索引,以使这些查询更有效.