SQLite& MySQL复合索引与单索引

时间:2017-07-12 11:59:29

标签: mysql sql sqlite

我有一个包含两个字段的表:library(tidyr) separate(df1, V2, into = c("V2", "V3"), "\\)\\*\\(", extra = "merge") # V1 V2 V3 #1 r1 (Direct Mary*(Sewnf 45*S-a)) #2 r2 (Ax 70a12*Qunion Kin - 32431*Tip) #3 r3 (PAN*Q-23 BE 05/514/10) 两个字段都单独编制索引 - 没有复合索引。

尝试使用两个字段运行选择查询时:

a,b

耗时超过400毫秒。而

select * from table where a=<sth> and b=<sth>

只用了30ms;

我是否需要为 select * from table where a=<sth> 设置复合索引?

合理地说,如果我在(a,b)a上都有索引,那么对于b的查询应该如上所述吗?

3 个答案:

答案 0 :(得分:0)

对于此查询:

select *
from table
where a = <sth> and b = <sth>;

最佳索引位于table(a, b)。这也可用于您的第二个查询。

答案 1 :(得分:0)

通常(但并非总是如此)。 在您的情况下,a(和b)中的不同值的数量以及您在select中使用的列数可以改变db决定使用index / table的方式。 例如,

如果在表格中,当您查询时,您有100.000条记录,其中80,000条记录具有相同的值:

SELECT * FROM table WHERE a=<your value>

db engine可以决定直接“扫描”表而不使用索引,而如果你查询

SELECT a, b FROM table WHERE a=<your value> 

并且在索引中你也添加了列b(直接在索引中或使用INCLUDE),db引擎很可能会使用索引。

尝试在互联网上查看索引提示,并查看How can I index these queries?

答案 2 :(得分:0)

SQLite documentation解释了索引查找的工作原理。

一旦数据库使用索引查找某些行,另一个索引就不再有效使用了(没有简单的方法可以过滤第一次查找的结果,因为另一个索引引用了原始表中的行,而不是第一个索引中的条目)。请参阅Multiple AND-Connected WHERE-Clause Terms

要尽快在两列上进行索引查找,您需要Multi-Column Indices