1、B-Tree索引
在人们谈论索引的时候,如果没有特别指明类型,多半说的就是B树索引,它是使用 B-Tree 数据结构来存储数据。
也有很多存储引擎使用的是B+Tree,例如 InnoDB
例如:
CREATE TABLE People (
last_name varchar(50) not null,
first_name varchar(50) not null,
dob date not null,
gander enum('m','f') not null,
key(last_name, first_name, dob)
)
对于表中的每一行数据,索引中包含了 last_name、first_name, 和 dob 列的值。
索引对多个值进行排序的一局是 CREATE TABLE 语句中定义索引时列的顺序。
B-Tree 索引的查询类型:B-Tree 索引适用于全键值、键值范围或键前缀查找。其中键前缀查找只适用于很久最左键前缀的查找。
- 全值匹配:和索引中的所有列进行匹配。
- 匹配最左前缀:只使用索引的第一列,例如可查找所有姓为 Allen 的人。
- 匹配列前缀:可以只匹配某一列的值的开头部分。这里只使用了索引的第一列。
- 匹配范围值:可用于查找姓在 Allen 和 Barrymore 之间的人。这里只使用了索引的第一列。
B-Tree 索引的限制:
- 如果不是按照索引的最左列开始查找,则无法使用索引。例如上例中的索引无法用于查找名字为 Bill 的人,也无法只查找某个特定生日的人,因为这两个都不是最左数据列。
- 不能跳过索引中的列。也就是无法用于查找第一列和第三列的结果,因为跳过了第二列。但如果只查找第一列是可以的。
- 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。例如 WHERE last_name = 'zhangsan' AND first_name LIKE 'J%' AND dob = '2000-12-1',这个查询只能使用索引的前两列。
2、哈希索引
哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。 对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据化的指针。
在 MySQL 中,只有 Memory 引擎支持哈希索引。这也是 Memory 引擎的默认索引类型,Memory 引擎同时也支持 B-Tree 索引。
因为哈希索引的限制较多,所以只适用于某些特定的场合。而一旦适合哈希索引,则它带来的性能提升将非常显著。
另外,InnoDB 引擎有一个特殊的功能叫做”自适应哈希索引“。可以适当去了解。
3、空间数据索引
MyISAM 表支持空间索引(R-Tree),可以用作地理数据存储。和 B-Tree 索引不同,这类索引无需前缀查询。空间索引会从所有维度来索引数据。查询时,可以有效地使用任意维度来组合查询。
4、全文索引
全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。全文索引和其他几类索引的匹配方式完全不一样。它有许多需要注意的细节,如停用词、词干和复数、布尔搜索等。全文索引更类似于搜索引擎做的事情,而不是简单的 WHERE 条件匹配。
在相同的列上同时创建全文索引和基于值的 B-Tree 索引不会有冲突。