SQLite 索引
索引是数据库搜索引擎用来加快数据检索速度的特殊查找表。简单来说,索引是指向表中数据的指针。数据库中的索引与书本背后的索引非常相似。
举个例子,如果你想引用一本书中讨论某个特定主题的所有页面,你首先会查阅索引,索引会按照字母顺序列出所有主题,并指向一个或多个特定的页码。
索引有助于加速SELECT查询和WHERE子句,但会导致数据输入变慢,尤其在使用UPDATE和INSERT语句时。索引的创建或删除对数据没有影响。
创建索引涉及使用CREATE INDEX语句,该语句允许您命名索引,指定需要索引的表和列,以及指示索引是升序还是降序。
索引也可以是唯一的,类似于UNIQUE约束,索引可以防止列或组合列中存在重复的条目。
CREATE INDEX命令
以下是 CREATE INDEX 的基本语法。
CREATE INDEX index_name ON table_name;
单列索引
单列索引是仅基于一张表列创建的索引。基本语法如下−
CREATE INDEX index_name
ON table_name (column_name);
唯一索引
唯一索引不仅用于提高性能,还用于数据完整性。唯一索引不允许在表中插入任何重复的值。基本语法如下:
CREATE UNIQUE INDEX index_name
on table_name (column_name);
组合索引
组合索引是在表的两个或更多列上创建的索引。基本语法如下:
CREATE INDEX index_name
on table_name (column1, column2);
在考虑创建单列索引还是复合索引时,需要考虑在查询的WHERE子句中经常使用的列作为过滤条件。
如果只使用一个列,则应选择单列索引。如果有两个或多个经常在WHERE子句中作为过滤器使用的列,则复合索引是最佳选择。
隐式索引
隐式索引是数据库服务器在创建对象时自动创建的索引。主键约束和唯一约束都会自动创建索引。
示例
以下是一个示例,我们将为COMPANY表的salary列创建索引 –
sqlite> CREATE INDEX salary_index ON COMPANY (salary);
现在,让我们使用以下的 .indices 命令列出COMPANY表中所有可用的索引:
sqlite> .indices COMPANY
这将产生以下结果,其中 sqlite_autoindex_COMPANY_1 是一个隐式索引,在创建表时自动生成。
salary_index
sqlite_autoindex_COMPANY_1
您可以按如下方式列出整个数据库的所有索引:
sqlite> SELECT * FROM sqlite_master WHERE type = 'index';
DROP索引命令
可以使用SQLite的 DROP 命令删除索引。在删除索引时需要注意,因为性能可能会变慢或改善。
以下是基本语法:
DROP INDEX index_name;
您可以使用以下语句来删除之前创建的索引。
sqlite> DROP INDEX salary_index;
什么情况下应避免使用索引
尽管索引旨在提高数据库的性能,但有时应避免使用索引。以下准则指示了何时应重新考虑使用索引。
在以下情况下不应使用索引:
- 小表。
- 经常进行大批量更新或插入操作的表。
- 包含大量NULL值的列。
- 经常被操作的列。