龙空技术网

MySQL索引看这篇就够了

浮生半月闲 1012

前言:

目前咱们对“mysql后缀索引”大概比较珍视,你们都需要剖析一些“mysql后缀索引”的相关资讯。那么小编也在网络上汇集了一些关于“mysql后缀索引””的相关知识,希望咱们能喜欢,兄弟们快快来学习一下吧!

MySQL索引相关问题是面试初中高级的时候一个高频问题,几乎有70%的概率会碰到。而很多人其实对这一块只是知道个概念,一旦问深入一些就答不上来。更有甚者只知道索引可以加快查询速度,其它就不清楚。

百度百科上对索引的定义是“索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息”;维基百科的定义“数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据”,描述都挺抽象的,很大比例的程序员对索引的了解也止步于此。

要谈MySQL的索引就不得不先谈MySQL的存储引擎,在新建表的时候可以选择表的存储引擎。

最常用的也就是myisam和innodb,那么这两个存储引擎有何区别呢?我们应该如何选择呢?这也是面试中经常会被问到的问题。我们先在MySql中使用两种引擎建两张表table_innodb和table_myisam分布使用innodb引擎和myisam引擎,进入mysql的datadir下看看两种引擎生成的文件。

可以看到innodb引擎一张表只生成一个文件,而myisam引擎一张表对应三个文件,其中myisam引擎生成的三个文件后缀类型分别保存表相关不同类型的数据:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)。而innodb引擎则是将三种数据都保存在.frm文件中了。至此可以比较容易为何innodb叫聚集索引(三类数据存放在同一个文件),而myisam称为非聚集索引(三类数据分开存放在不同的文件)。

而因为myisam引擎一个表对应三个文件,所以myisam不支持事务(姑且这么记)。其它区别还是innodb支持行级锁和外键,而myisam是表级锁,支持全文索引;myisam和插入和查询效率相对innodb要高,最显而易见的原因innodb将三种数据保存在同一个文件必然导致文件数据文件相比myisam引擎更大,在更大的文件中查询和插入肯定会更慢(当然也还有其它的原因,这样更便于记忆)。这么想的话是不是比干背概念好记多了。

接下来聊聊索引,在新建索引的我们可以选择采用哪种索引,如下图:

有BTREE、HASH和默认(B+BREE)。先谈谈最简单的hash索引,hash索引基于哈希表实现的,哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。

再来看看B TREE和B+TREE的数据结构:

BTREE数据结构

B+TREE数据结构

可以清晰的看到BTREE和B+TREE的区别就是B+TREE的非叶子节点只存储索引,不存储数据,因此所有的数据都要查询至叶子节点,而叶子节点的高度都是相同的,因此所有数据的查询速度都是一样的,因为B+Tree的非叶节点中不存储data,就可以存储更多的key;而BTREE所有节点都存储数据和索引;B+TREE和指向而BTREE没有。MySQL的默认索引就是采用的B+TREE。

而前文提到过的两种不同的存储引擎对应的索引数据也有一些小的差异,myisam的索引叶子节点包含索引值和指向数据行的对应物理地址的指针,而innodb则是每个叶子节点包含索引值和对应行的数据。

结构大致如下:

innodb索引结构

myisam索引结构

MySQL索引相关知识点就分享到这里,当然还有一些细节没有说到,可以去网上查一下资料自己研究下,不过也包含了大部分了,应付大部分面试是没啥问题了,哈哈。

标签: #mysql后缀索引