mysql索引总结(01)-mysql索引概述
索引概述
索引是数据库中一个非常重要的数据结构,如果没有索引,那么我们查询我们的目标数据,需要全表扫描查找,而有了索引 ,在查询性能上可以有成倍的提升。
就比如我们要在字典上查询某个字,如果一页一页的翻,势必需要很长的时间,但是如果我们知道某种规则比如拼音,那么我们就能快速的定位到我们想要找的内容。数据库的索引也可以看做遵循某种方便我们查询的规则的一个目录。
但是索引也并不是越多越好,合理的索引和优化是使用mysql来查询数据的关键.
索引分类
索引有多重分类,比较常见的有
B+树索引 :基于B+ 树构建的索引结构;
哈希索引 : 基于hash表实现的索引结构;
B+ 树索引
在 mysql-5.5.5 之前,mysql 的默认存储引擎还是myIsam,myIsam最早的时候索引使用的是B树;
我们知道树(tree) 这种数据结构有很多的类别,这些类别都是一点一点演变和为了解决某一个问题的;
二叉搜索树(binary Seach tree)查询的性能非常好,但是可能出现链表退化的问题,导致查询性能变差,树越平衡树的查询性能越好,有了二叉平衡树比如AVL树或红黑树;
而目前数据库中的索引的数据结构比较常用的数据结构是用B+树,简单的了解索引的数据结构,对于如何建立索引或sql查询优化是有很大的帮助的.
B + 树是在B 的结构上演变而来,所以会非常像;
B树[图1]上图为一各三阶B树,阶可以理解为树的分叉或子节点的个数;
B+树[图2]上图为一个B+树的结构;
B+树和B树的相同点:
1,节点存储数量量大;一个节点都可以存储多个元素;(不同于二叉搜索树比如红黑树只能每个节点存储一个元素)
2, 搜索性能好;拥有二叉搜索树的性质,并且是平衡树,元素有序排列,查询性能好;
B+树和B树的不同点:
1,最大的特定是在叶子节点上有个左右连接的指针,把所有的叶子节点的数据连接起来;
2,B树的数据是分散在所有节点上的,而B+ 树的所有叶子节点包含了所有的数据,非叶子节点只是为了查询的冗余数据.
那么这个指针的用处是什么呢?
假如我们来做一个简单的sql查询,并且建立了索引;
select age from user where age >10;
因为B+树聚簇索引的数据都是在叶子节点,当通过B+树索引找到叶子节点的要搜索的指定的数据后,要做范围查询,能直接根据指针向前或向后遍历获取要查询的范围数据.
B+树的一个重要的特定是高扇出性,所以能够容纳比较多的数据,同时树 的高度也不会超过4层;
hash索引
hash索引结构hash索引主要是维护了一个hash表,可以看做是一个定长存储空间的数组。
当建立索引时,比如根据id,mysql内部先对建立索引的数据执行hash函数,生成一个hash值(hash算法生成的一个整数),由hash值 % hash表长度 = 此索引数据存放的位置;
比如数据索引计算的hash值是 325 ,hash表长度 300 那么 325 % 300 =25,这条索引就存在hash表第24 索引的位置,存储指向数据的磁盘地址;
查询的时候,只需要计算一个查询数据的hash算法的结果,就能快速定位到想要的数据;
hash冲突:可能出现多个数据计算的hash值一样或者计算的最终取模的结果一样,造成索引存储的hash表的槽位一样,这种现象叫hash冲突。mysql 总解决hash冲突的方法是适用链表解决,对hash冲突的数据适用链表连接起来;
hash索引的优缺点
优点
1,查询速度很快,时间复杂度O(1);
缺点
1,不支持范围查询(因为数据存放并不是有序的,具有很大的随机性)
2,可能出现hash冲突的问题