我有一个包含两个字段的表: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
的查询应该如上所述吗?
答案 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。