我有一个包含两个字段的表:a,b
这两个字段分别编制索引 - 没有复合索引。
尝试使用两个字段运行选择查询时:
select * from table where a=<sth> and b=<sth>
它花了400多毫秒。
select * from table where a=<sth>
只花了30ms;
我需要为(a,b)
设置复合索引吗?
合理地,如果我在a
和b
上都有索引,那么像上面这样a AND b
查询应该很快吧?
对于此查询:
select *
from table
where a = <sth> and b = <sth>;
最好的指数是table(a, b)
。 这也可以用于第二个查询。
通常(但并非总是如此(。 在您的情况下,a(和b(中不同值的数量以及您在选择中使用的列数可以改变db决定使用索引/表的方式。 例如
例如,如果在表中有 100.000 条记录,其中 80.000 条记录具有相同的 A 值,则当您查询:
SELECT * FROM table WHERE a=<your value>
数据库引擎可以决定直接"扫描"表而不使用索引,而如果您查询
SELECT a, b FROM table WHERE a=<your value>
在索引中,您也添加了 B 列(直接在索引中或使用 INCLUDE (数据库引擎很可能会使用该索引。
尝试在互联网上查看索引提示,并查看如何索引这些查询?
SQLite 文档解释了索引查找的工作原理。
一旦数据库使用索引查找某些行,另一个索引就不再有效使用(没有简单的方法来筛选第一次查找的结果,因为另一个索引引用原始表中的行,而不是第一个索引中的条目(。请参阅多个 AND 连接的 WHERE 子句术语。
若要尽可能快地对两列进行索引查找,需要多列索引。