MYSQL索引详解
Posted Java后台开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL索引详解相关的知识,希望对你有一定的参考价值。
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。数据库索引按照不同的标准可以分为以下几类:
从数据结构角度
1. 顺序索引
2. B+树索引
3. hash索引
从物理存储角度
1. 聚簇索引(clustered index)
2. 非聚簇索引(non-clustered index)
从数据结构角度看
顺序索引即按照顺序存储搜索码的值,并将每个搜索码与包含该搜索码的记录关联起来。顺序索引的最大缺点在于随着文件的增大,索引查找性能和数据顺序扫描性能都会下降,而B+树这种数据结构是在数据插入或删除的情况下仍能保持其执行效率的几种使用最广泛的索引结构之一。
要讲B+树之前,先要介绍一下B树,其结构如下:
B树即多路平衡查找树,其因为每层其每个节点都保存了索引和数据,并且每层的节点数相对于平衡二叉树来说更多,所以其树的结构相对更矮更胖,这也更符合查找时磁盘IO次数尽量减少的要求,在查找索引时磁盘IO所花费的时间占了很大一部分,所以磁盘IO的时间越短越好。例如要查找id=60的数据,只要经过两次磁盘IO就能找到。B 树的查找的时间复杂度为 O(h*logn),h为树的高度,n为每个节点关键词的个数。
B+树的结构如下:
B 树和 B+树有什么不同呢?
由于B+树节点存储的是索引,在单个节点存储容量有限的情况下,单节点也能存储大量索引,使得整个 B+树高度相对于B树来说更低,减少了磁盘 IO。其次,B+树的叶子节点是真正数据存储的地方,叶子节点用了链表连接起来,这个链表本身就是有序的,在数据范围查找时,更具备效率。因此 Mysql 的索引结构用的就是 B+树,B+树在查找效率、范围查找中都有着非常不错的性能。
hash表是做数据快速检索的有效利器,hash索引将搜索码及其相应的指针组织成hash文件结构,可以以O(1)的时间复杂度快速定位到相应数据。但是 mysql 并没有采取哈希作为其底层算法,这是为什么呢?
从物理存储角度看
聚簇索引即包含记录的文件按照某个搜索码指定的顺序排序,即索引的顺序就是数据的物理存储顺序,由此可以知道聚簇索引只能有一个。只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。
非聚簇索引也称辅助索引,即索引的顺序与数据的物理存储顺序不同,聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针,非聚簇索引可以有多个。
Mysql的索引
Mysql 底层数据引擎以插件形式设计,最常见的是 Innodb 引擎和 Myisam 引擎,用户可以根据个人需求选择不同的引擎作为 Mysql 数据表的底层引擎。我们刚分析了,B+树作为 Mysql 的索引的数据结构非常合适,但是数据和索引到底怎么组织起来也是需要一番设计,设计理念的不同也导致了 Innodb 和 Myisam 的出现,各自呈现独特的性能。
Innodb 创建表后生成的文件有:
frm:创建表的语句
idb:表里面的数据+索引文件
Myisam 创建表后生成的文件有
frm:创建表的语句
MYD:表里面的数据文件(myisam data)
MYI:表里面的索引文件(myisam index)
从生成的文件看来,这两个引擎底层数据和索引的组织方式并不一样,MyISAM 引擎把数据和索引分开了,一人一个文件,这是非聚簇索引方式。Innodb 引擎把数据和索引放在同一个文件里了,这是聚簇索引方式。
以上是关于MYSQL索引详解的主要内容,如果未能解决你的问题,请参考以下文章