索引

概念

索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。

拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入。索引可以创建或删除,但不会影响数据。

使用 CREATE INDEX 语句创建索引,它允许命名索引,指定表及要索引的一列或多列,并指示索引是升序排列还是降序排列。

索引也可以是唯一的,与 UNIQUE 约束类似,在列上或列组合上防止重复条目。

语法

单列索引:

1
2
CREATE INDEX index_name 
ON table_name (column_name);

唯一索引:

1
2
CREATE UNIQUE INDEX index_name
on table_name (column_name);

联合索引:

1
2
CREATE INDEX index_name
on table_name (column1, column2);

隐式索引:

1
隐式索引是在创建对象时,由数据库服务器自动创建的索引。索引自动创建为主键约束和唯一约束。

示例

1
CREATE INDEX salary_index ON COMPANY (salary);

列出索引

1、可以使用 .indices 或 .indexes 命令列出 COMPANY 表上所有可用的索引:

1
.indices COMPANY

这将产生如下结果,其中 sqlite_autoindex_COMPANY_1 是创建表时创建的隐式索引:

1
2
salary_index
sqlite_autoindex_COMPANY_1

2、查询数据库范围的所有索引
可以查询sqlite_master表:

1
SELECT * FROM sqlite_master WHERE type = 'index';

删除索引

一个索引可以使用 SQLite 的 DROP 命令删除。当删除索引时应特别注意,因为性能可能会下降或提高:

1
DROP INDEX index_name;

何时应避免使用索引

虽然索引的目的在于提高数据库的性能,但这里有几个情况需要避免使用索引。使用索引时,应重新考虑下列准则:

索引不应该使用在较小的表上。

索引不应该使用在有频繁的大批量的更新或插入操作的表上。

索引不应该使用在含有大量的 NULL 值的列上。

索引不应该使用在频繁操作的列上。

INDEX BY

概念

“INDEXED BY index-name” 子句规定必须需要命名的索引来查找前面表中值。

如果索引名 index-name 不存在或不能用于查询,然后 SQLite 语句的准备失败。

“NOT INDEXED” 子句规定当访问前面的表(包括由 UNIQUE 和 PRIMARY KEY 约束创建的隐式索引)时,没有使用索引。

然而,即使指定了 “NOT INDEXED”,INTEGER PRIMARY KEY 仍然可以被用于查找条目。

语法

1
2
3
4
SELECT|DELETE|UPDATE column1, column2...
INDEXED BY (index_name)
table_name
WHERE (CONDITION);

示例

1
SELECT * FROM COMPANY INDEXED BY salary_index WHERE salary > 5000;