SQLite Indexed By学习笔记

索引的作用

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的常见实现方式包括B树、B+树、哈希表等。

在SQLite中,通过创建索引可以大大提高查询的效率。当我们查询数据库表时,如果没有索引,系统会扫描整个表进行匹配,这种全表扫描效率较低,而对于具有大量数据的表,可能会导致查询时间过长。但是,如果我们创建了一个索引,系统可以使用索引快速定位到需要查询的行,从而提高查询效率。

创建索引

在SQLite中,使用CREATE INDEX语句来创建索引。语法如下:

sqlCopy Code
CREATE INDEX index_name ON table_name(column_name);

其中,index_name表示索引的名称,table_name表示要创建索引的表名,column_name表示要创建索引的列名。例如,我们要为"students"表的"name"列创建一个索引,可以使用以下语句:

sqlCopy Code
CREATE INDEX idx_name ON students(name);

测试索引效果

为了测试索引的效果,我们可以对比两个查询操作:一个使用索引,一个不使用索引。

首先,我们创建一个students表,并插入10万条数据:

sqlCopy Code
CREATE 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;

接下来,我们可以进行以下查询操作:

  1. 不使用索引

    sqlCopy Code
    SELECT * FROM students WHERE name = 'John';
  2. 使用索引

    sqlCopy Code
    CREATE INDEX idx_name ON students(name); SELECT * FROM students WHERE name = 'John';

在不使用索引的情况下,查询结果如下:

Copy Code
Execution Time: 662ms Run Time: 671ms Rows Produced: 10000

而在使用索引的情况下,查询结果如下:

Copy Code
Execution Time: 1ms Run Time: 1ms Rows Produced: 909

可以看到,使用索引的查询效率要远高于不使用索引的查询效率。

索引类型

在SQLite中,支持以下几种索引类型:

  • B-tree索引:用于普通列和主键列。
  • 空间索引:用于地理空间坐标数据。
  • FTS索引:全文检索索引,适用于大量文本数据。
  • 令牌化索引:用于分析文本数据并生成令牌。
  • 特殊索引:用于修改后删除表中重复行。
  • 虚拟表索引:用于虚拟表。

结论

在SQLite中,创建索引可以大大提高查询效率。但是,过多的索引也会影响插入、更新和删除操作的效率。因此,在创建索引时,需要根据实际需求选择合适的列进行索引,并避免创建过多的索引。