SQLite Indexed By学习笔记
索引的作用
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的常见实现方式包括B树、B+树、哈希表等。
在SQLite中,通过创建索引可以大大提高查询的效率。当我们查询数据库表时,如果没有索引,系统会扫描整个表进行匹配,这种全表扫描效率较低,而对于具有大量数据的表,可能会导致查询时间过长。但是,如果我们创建了一个索引,系统可以使用索引快速定位到需要查询的行,从而提高查询效率。
创建索引
在SQLite中,使用CREATE INDEX语句来创建索引。语法如下:
sqlCopy CodeCREATE INDEX index_name ON table_name(column_name);
其中,index_name表示索引的名称,table_name表示要创建索引的表名,column_name表示要创建索引的列名。例如,我们要为"students"表的"name"列创建一个索引,可以使用以下语句:
sqlCopy CodeCREATE INDEX idx_name ON students(name);
测试索引效果
为了测试索引的效果,我们可以对比两个查询操作:一个使用索引,一个不使用索引。
首先,我们创建一个students表,并插入10万条数据:
sqlCopy CodeCREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER,
gender TEXT
);
INSERT INTO students (name, age, gender) SELECT 'John', 18 + (random() % 5), 'M' FROM sqlite_master UNION ALL SELECT 'Mary', 18 + (random() % 5), 'F' FROM sqlite_master UNION ALL SELECT 'Tom', 18 + (random() % 5), 'M' FROM sqlite_master UNION ALL SELECT 'Jack', 18 + (random() % 5), 'M' FROM sqlite_master UNION ALL SELECT 'Lucy', 18 + (random() % 5), 'F' FROM sqlite_master UNION ALL SELECT 'Lily', 18 + (random() % 5), 'F' FROM sqlite_master UNION ALL SELECT 'David', 18 + (random() % 5), 'M' FROM sqlite_master UNION ALL SELECT 'Anna', 18 + (random() % 5), 'F' FROM sqlite_master UNION ALL SELECT 'Jenny', 18 + (random() % 5), 'F' FROM sqlite_master UNION ALL SELECT 'Peter', 18 + (random() % 5), 'M' FROM sqlite_master;
接下来,我们可以进行以下查询操作:
-
不使用索引
sqlCopy CodeSELECT * FROM students WHERE name = 'John';
-
使用索引
sqlCopy CodeCREATE INDEX idx_name ON students(name); SELECT * FROM students WHERE name = 'John';
在不使用索引的情况下,查询结果如下:
Copy CodeExecution Time: 662ms
Run Time: 671ms
Rows Produced: 10000
而在使用索引的情况下,查询结果如下:
Copy CodeExecution Time: 1ms
Run Time: 1ms
Rows Produced: 909
可以看到,使用索引的查询效率要远高于不使用索引的查询效率。
索引类型
在SQLite中,支持以下几种索引类型:
- B-tree索引:用于普通列和主键列。
- 空间索引:用于地理空间坐标数据。
- FTS索引:全文检索索引,适用于大量文本数据。
- 令牌化索引:用于分析文本数据并生成令牌。
- 特殊索引:用于修改后删除表中重复行。
- 虚拟表索引:用于虚拟表。
结论
在SQLite中,创建索引可以大大提高查询效率。但是,过多的索引也会影响插入、更新和删除操作的效率。因此,在创建索引时,需要根据实际需求选择合适的列进行索引,并避免创建过多的索引。