我的包含列
A
、B
、C
、D
的表格在 A
、B
上有索引。
对于查询
SELECT A,B,C,D, From MyTable WHERE A=? AND B=? ORDER BY C DESC
,我希望SQLite使用A
和B
匹配的索引,然后根据需要按C
排序。查询执行缓慢,并且 EXPLAIN QUERY PLAN
显示 SQLite 仅使用 A
进行部分搜索,然后扫描。如果我删除 ORDER BY
,则会使用整个索引。
这是预期的吗?我可以提示 SQLite 使用整个索引吗?
由于列
c
没有索引,数据库必须检索满足列 a
和 b
指定条件的所有行,然后对它们进行排序。使用索引时,数据库需要根据匹配的索引条目从磁盘读取完整的行。这些行存储在磁盘上的不同位置,需要随机 I/O。另一方面,全表扫描使用顺序 I/O,这比随机 I/O 快得多。因此,当一次加载表中超过10%-30%的行时,大多数数据库会选择全表扫描。这个阈值不是固定的,取决于多种因素。