我有(例如)一个索引:
CREATE INDEX someIndex ON orders (customer,date);
这个索引只加速使用客户和日期的查询,还是加速这样的单列查询?
SELECT * FROM orders WHERE customer > 33;
我使用sqlite。
如果答案是肯定的,为什么可以为每个表创建多个索引?
另一个问题:当在查询中使用两个列时,组合索引与两个分离索引相比有多快?
marc_s对你的第一个问题有正确的答案。多键索引中的第一个键可以像单个键索引一样工作,但任何后续键不会。
至于复合索引的速度取决于你的数据和你的索引和查询的结构,但它通常是重要的。索引本质上允许sqlite对字段进行二进制搜索。
使用您给出的示例,如果您运行查询:
SELECT * from orders where customer > 33 && date > 99
sqlite将首先在整个表上使用二进制搜索获得所有结果,其中customer>然后,它将仅对寻找日期>的那些结果进行二分搜索。 99。
如果您对客户和日期使用两个单独的索引执行相同的查询,sqlite将必须二次搜索整个表,首先是客户,再次是日期。
因此,您将看到的速度增加多少取决于如何根据查询构建索引。理想情况下,索引和查询中的第一个字段应该是消除最可能匹配的字段,因为通过大大减少第二个搜索必须完成的工作量,最大的速度将会提高。
有关详细信息,请参阅:
http://www.sqlite.org/optoverview.html