浅谈Mysql中的索引 | 8月更文挑战

479 阅读3分钟

浅谈Mysql中的索引

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

前言:索引是一种数据结构,其可以帮助我们快速的找到相应的记录,在mysql中一个好的索引能够良好的提升数据库的性能,尤其是在数据量比较大的时候。

索引是什么?

关于索引听到最多的比喻就是把索引比作字典里面的目录。索引其实就是一种帮助mysql高效获得数据的存储结构。

mysql中的索引

  • 按存储结构分为:B树索引、全文索引、哈希索引。
  • 按中数据的物理顺序与键值的逻辑顺序关系:聚簇索引、非聚簇索引。

B树索引

B树索引包括了B+树索引,mysql官方将B+树成为B树的一个改进。此外B树索引可以避免全表扫描,加快数据的访问。B树其所有结点都用于存储数据,而且一个节点可以保存多个数据。但是在范围查找时候,有时候效率不是很高。具体其结构如下:

image.png

B+树索引是B树索引的一个改进,mysql中的b+树结构和跳表有点类似,其叶子节点用于保存数据,而非叶子节点则保存一个指向相应节点的指针,而且叶子节点直接用链表相连,有效的解决了B树索引范围查找效率不高的问题。具体结构如下:

image.png

哈希索引

哈希索引是一种基于哈希表的索引,其需要精确匹配才能生效,哈希索引只满足'=','IN','<=>'查询,不可以用于范围查询。此外对于组合索引,哈希索引是将组合键合并后计算哈希,而不是单个单个计算,所以只满足组合索引的前几位,也不能走哈希索引。此外由于哈希索引中可能存在相同的hash值,所以其不可避免全表扫描。 哈希索引结构如下:

image.png

聚簇索引和非聚簇索引

聚簇索引和非聚簇索引采用的数据结构都是b+树,但是聚簇索引是叶子节点保存数据,而非聚簇索引则是叶子节点保存地址,读取数据需要到另外一个文件中进行读取。

Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。

聚簇索引数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快,但是插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。还有就是更新主键的代价比较高,二级索引需要两次索引查找,先找到主键,再找到相应的值。

聚簇索引之上创建的索引称之为非聚簇索引索引,非聚簇索引索引访问数据总是需要二次查找。其叶子节点存储的不再是行的物理位置,而是主键值。其首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。

image.png

结语:至此关于mysql中的索引的介绍就到这里结束啦,大伙明天见!!