Mysql最左前缀何以可能?

最左前缀是在检索数据时会从联合索引的最左边开始匹配。

那么为什么从最左边开始匹配?

这就要引入Mysql索引的结构——B+树

为什么是B+树?

B+树可以看作是一个m阶B树 + 节点只包含key + 相互连接并储存实际数据的叶节点

为什么不用B树

  • B+树能更好利用内存、缓存等高速储存。因为B+树节点不储存实际数据
  • 全表扫描更快。因为B+树叶节点连在一起,那么遍历就是一个线性遍历过程,相比于B树树遍历可能会引发更多的cache命中失效

但B树也不是完全弱于B+树,B树key、value放在一起,找到key就找到了value,所以理论上查找效率更高

为什么不用hash

  • 不利于范围查询
  • 不利于排序
  • 不支持索引部分匹配查找
  • 大量重复键下,hash效率低

Hash在数据结构中可以称之为神之结构——一骑绝尘的查询速度。然而在现实场景中往往是极为复杂的,其其他不利之处就展现出来了

为什么不用红黑树

  • IO代价高。要一层一层找

Mysql是如何用B+树构造索引的呢?

在Mysql中,对于主键索引,叶节点储存的就是实际数据。而对于其他普通索引则是储存着主键,这也就意味着对于普通索引来说,还需要重新检索主键索引,这样的过程称之为回表

主键索引也就是聚簇索引,聚的是索引和实际数据

此外,在5.6之后引入了索引下推来减少回表的查询次数。下推就是将Mysql服务层做的判断是否满足WHERE条件尽可能交给引擎层处理(比如能用索引中列来检查判断的)

而联合索引就像英语字典一样,想要找到一个单词,首先要找到首字母,然后从左到右依次找下去。

有一种特殊的联合索引叫覆盖索引,就是索引本身已经覆盖了我们本次查询的需求。比如说在联合索引(name, age)情况下,根据name查询age,那么这个时候也是不需要回表的

正是因为如此,最左前缀匹配使能之

Ref

  1. https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html
  2. https://en.wikipedia.org/wiki/B%2B_tree
  3. http://stackoverflow.com/questions/870218/differences-between-b-trees-and-b-trees

你可能感兴趣的:(mysql,b树,数据库)