MySQL索引(一)----数据结构类型

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 索引不会有冲突。

MySQL索引(一)----数据结构类型

上一篇:SQL PRIMARY KEY 主外键 约束


下一篇:Mysql8.0 连接的坑