从萌新的角度理解Mysql索引基本原理

2018-10-12  本文已影响0人  涂印

本文是针对Mysql索引原理剖析的入门级文章,主要围绕以下四个话题展开对索引相关原理的描述。

一丶索引基本概念

对照着生活中的概念,数据库索引的概念理解起来比较容易。数据库的索引相当于书籍的目录。

二丶(B+)-Tree索引基本实现

(B+)-Tree是一个数据结构,是一个平衡的多路查找二叉树。Mysql innodb引擎中建立的索引默认就是基于(B+)-Tree实现的索引。

  1. B+树的叶子节点存储了所有的数据,非叶子节点中存储的是比较关键字。而B数所有的节点都会存储数据。例如,在B+树中查找数字26的过程是 p1->p3->26,最终在叶子节点里找到了待查找数字26。在B树中查找数字26,查找的顺序是p2->26,在非叶子节点中查找到了数据就返回。
  2. B+树的叶子节点之间存在一个指针连接,B树不存在指针连接。B+树这种设计结构能带来什么好处呢?
    B+树所有的数据都存储在叶子节点,那么顺着叶子节点从左往右即可完成对数据的遍历,极大了简化了排序操作。这也是mysql设计索引是采用B+树的原因,不仅仅能方便查找,而且有助于排序,在mysql的索引中叶子节点之间数双向链表可正反遍历,更加灵活

三丶关于Mysql常见术语的解疑

1. 聚族索引和非聚族索引

聚族索引和非聚族索引指的是存储结构
Mysql中InnoDB存储引擎是采用聚族索引的存储方式,是在主键上建立的聚族索引,MyISAM则是非聚族索引的方式。下文引用《高性能Mysql第三版167页的一张图解释下聚族索引和非聚族索引》

聚族索引和非聚族索引
聚族索引:数据表和索引文件是存储在一起的,位于同一文件。如图所示,以B+树构建的索引,其叶子节点存储了所有的行信息。数据表中的所有数据全部存储在索引的叶子节点中
非聚族索引:数据表和索引文件是分开存储的,是两个不同的文件。B+树的叶子节点,并不存储行信息,存储的是数据行的物理地址。
InnoDB存储引擎中非主键索引(二级索引)每个叶子节点除了存储索引字段外,额外存储了主键列。通过二级索引检索数据时,先检索到主键列,最后通过主键列在聚族索引中检索相应的数据行,这是一种二次检索的过程。非聚族索引不存在这种过程
2. 索引覆盖

理解索引的存储结构后,理解索引的覆盖就非常简单了。如果select语句所查询的字段全部都是索引列的话,称为索引覆盖。

  1. 对于聚族索引而言,如果满足索引覆盖,那么不用通过主键访问聚族索引。
  2. 对于非聚族索引而言,如果满足索引覆盖,那么不需要再次访问数据表。
    在满足索引覆盖的条件下,select语句从索引文件从就可以拿到所查询的数据,而不必访问数据行。
3. 最左前缀原则

最左前缀原则就是Mysql通过索引检索数据时必须遵守的原则。最左前缀原则的内容规定如下,满足如下情况,将使用索引查询。

4. 哈希索引

哈希索引不同于以B+树为存储结构的索引。哈希以哈希为存储结构组织索引。

image.png
hash索引原理比较简答,通过hash计算hashcode。hashcode = hash(col1,co2,..待索引列)。如果遇见hash冲突的话,可以链地址方法解决冲突。hashcode对应存储的value值是相关行的物理地址。哈希索引想比较于B+树构建的索引,其有如下不同:
5. 自适应哈希索引

自适应Hash索引是InnoDB存储引擎添加的一种优化策略。InnoDB存储引擎对那些查询频繁的索引条件,构建一个hash索引。下若有相同的查询语句,则直接命中hash索引,而不必走B+树索引,能提高检索速度。自适应Hash索引是innoDB的一种优化策略,对用户而言是透明的。

四丶索引的局限性

有关索引局限性的讨论是一个比较有难度的话题,其不像原理分析那样固定。其在不同的业务场景下会有不同的结论。本文论文几种索引常见分析,并未涵盖所有情况

  1. 什么情况需要建立索引?
  1. 在什么列上建立索引
  1. 索引建立的顺序。
  1. 多列索引和多个单列索引
  1. 是否针对不同的查询条件,建立不同的索引
上一篇 下一篇

猜你喜欢

热点阅读