像大多数数据库开发人员一样,你可能已经编写了相当多的查询,这些查询在文本或二进制数据中搜索就如同大海捞针。我知道我有!也许比针对数据库编写的 SELECT 语句更重要的是它包含的索引。为此,倒排索引可以大大有助于以快速的方式访问大量数据。在今天的文章中,我们将以 MySQL 为例,学习什么是倒排索引,以及如何在数据库中使用它们。
正排索引与倒排索引
倒排索引实际上是在几十年前发明的,大约与第一个人工智能和机器学习算法诞生的时间相同。然而,直到最近计算能力的提高,才可能在传统关系数据库中使用倒排索引。倒排索引允许更快地找到关系数据库中的信息,并允许查询变得更加复杂和具体。
与将表行映射到关键字列表的常规(正向)索引不同,倒排索引将关键字映射到它们各自的行。这是并排比较:
正排索引 | 倒排索引 | ||
---|---|---|---|
行 | 关键字 | 单词 | 行 |
行1 行2 行3 |
hello, sky, morning tea, coffee, hi greetings, sky |
hello sky coffee hi greetings |
行1 行1, 行3 行2 行2 行3 |
使用正排索引进行搜索是一个较慢的过程,因为数据库引擎必须查看索引的全部内容才能检索与某个单词相关的所有页面。同时,通过倒排索引搜索就非常快,因为索引中没有重复的关键字,并且每个单词都直接指向相关行。
MySQL 中的倒排索引
MySQL 的 InnoDB 引擎在基于文本的列(CHAR、VARCHAR 或 TEXT 列)上实现全文索引,以加快对这些列中包含的数据的查询和 DML 操作。全文索引采用倒排索引设计,索引中的每个关键字都指向出现该单词的文档列表。它还支持邻近搜索,也可以通过存储每个单词的位置来定位出现在一定数量单词内的两个或多个单词。
在 Navicat 数据库管理开发工具中,例如 Navicat for MySQL 和 Navicat Premium,你可以在常规信息窗格中查看表的引擎:
假设你的表使用 InnoDB 引擎,你可以在表设计器的“索引”选项卡上的“索引类型”下拉列表指定 FULLTEXT 索引。这是添加 FULLTEXT 索引的最佳列的示例 - Sakila 示例数据库的 Film 表中的 Description 列:
像这样的文本字段很适合使用倒排索引,因为要搜索的单词和短语太多了:
总结
倒排索引是一种加速查询的好方法,同时允许它们变得更加复杂和具体。请注意,索引过程比正向索引花费的时间更长。
如果你对 Navicat for MySQL 或 Navicat Premium 感兴趣,可以免费试用 14 天!
Rob Gravelle 居住在加拿大渥太华,是一名有 20 多年经验的 IT 专家。过往,Rob 曾为与情报有关的组织(如加拿大边境服务局和各种商业组织)构建系统。在业余时间,Rob 是一名出色的吉他演奏家,他拥有多张 CD 和数字发行版。