主要观点:解释了在 SQLite 索引中如何进行搜索,包括二进制搜索过程、通过 EXPLAIN 命令查看内部操作、添加函数跟踪搜索中的页面和单元格等,还展示了不同查询条件(如单列相等条件、IN()多个值、ASC/DESC 索引比较、范围搜索、表达式搜索、在唯一索引和无 NULL 值索引中搜索、两列索引搜索、不同数据基数索引搜索等)下的搜索情况及相关可视化图像和代码示例,最后得出可视化索引搜索操作有助于理解数据库工作及优化查询的结论。
关键信息:
- SQLite 内部通过二进制搜索在页面内的单元格值中查找,找到最接近匹配后选择该单元格的左子节点,若页面所有单元格值都小于目标则选择右子节点。
- 可通过 EXPLAIN 命令查看索引搜索的 OPCODE 等信息,如
SELECT rowId, column1 FROM table_test INDEXED BY idx WHERE column1 = 1;
的 EXPLAIN 输出。 - 可添加函数
if (sqlite3DebugIsBtreeIndexSeekEnabled()) {...}
来跟踪搜索中的页面和单元格。 - 不同查询条件下的搜索情况及相关图像和代码示例,如单列相等查询、IN()查询、ASC/DESC 索引查询等。
重要细节:
- 每个查询的具体代码和创建的表结构、索引等细节,如
CREATE TABLE table_test (column1 INT NOT NULL); INSERT INTO table_test (column1) VALUES (1),(2),(3),...; CREATE INDEX idx ON table_test (column1 ASC);
。 - 不同查询条件下的搜索结果,包括读取的页面数、比较的单元格数、过滤的单元格数等,如在单列相等查询中读取 3 页、比较 19 个单元格等。
- 不同索引顺序在不同数据基数下的搜索性能差异,如在两列索引搜索中,低基数列在前时找到第一个匹配需更多比较,但能快速过滤剩余行。
- 所有生成的图像可通过
docker run -it --rm -v "$PWD":/app/data --platform linux/x86_64 mrsuh/sqlite-index bash; sh bin/test-search.sh;
命令重现,代码和示例可在这里获取。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。