您的查询是否花费太长时间才能运行?在本文,我将解释索引在SQLite中如何工作,以及如何设计索引以使您最重要的查询达到更好的性能。下图即是一个索引使用的真实场景。
幸运的是,我们无需了解杜威十进制分类法(Dewey Decimal System)即可了解SQLite索引的工作原理!
主键,查询计划和二分搜索
当您在SQLite中定义表时,可以选择将INTEGER列表示为AUTO_INCREMENT PRIMARY KEY,或者使用系统为您提供的默认rowid主键列。当您向该表添加新记录时,系统会为这些主键字段自动分配一个递增的唯一值,并以该主键的升序方式存储在数据库文件中。
以主键排序的顺序存储记录的好处是,当您要查找具有某个ID的记录时,SQLite可以在O(log n)时间内执行二分搜索,而不是完整的O(n) 时间去扫描全表。
二分搜索:O(log n)与完全扫描:O(n)的比较
想象一下,我们有一个表,其中包含有关标签的信息,这些信息是通过以下CREATE TABLE语句定义的:
CREATE TABLE tags ( title TEXT, description TEXT, created TEXT ); |
示例数据如下:
该表未明确指定PRIMARY KEY列,因此使用rowid。