mysql数据库的索引

数据库的索引


索引在数据库中属于十分重要的知识点之一

那么为什么要建立索引呢?

最主要的原因就是:索引能加快数据库的检索速度,它对于存储大量数据的数据表检索速度的提升是十分明显的。

聊一聊为什么索引能加快数据库检索速度


其实Mysql索引的底层实现结构是B+树


什么是B+树索引结构呢?


定义:
1、符合二叉搜索树特性,且是一颗平衡树
2、根节点至少包含2个以上的孩子
3、非叶子节点,指针数(上图P1,P2,P3)与孩子数(节点参数)相等
4、叶子节点才存储数据,非叶子节点用来当作索引
5、叶子节点的数据是通过链表串联在一起的,有利于区间查找(密集索引)

由于B+树是一颗平衡树,所以频繁增删改的参数不适合设置索引,因为若想维持平衡的化,必须做出反转等操作,会增加数据库工作量,导致速度下降。

Hash索引结构


除了B+树,还有一种常见的是Hash索引


它根据哈希函数的运算,只需一个经过一次定位,就能查找到所需数据的相应位置
而B+树则是:
根节点-->叶子节点-->非叶子节点
理论上Hash索引效率更高
但是,由于Hash运算的无序性,Hash索引仅能满足"=","in"等方式,而无法使用范围查询,也无法支持最左匹配原则

密集索引与稀疏索引


密集索引:叶子节点保存的不仅是键值,还保存了位于同一行其他列的信息(数据)
稀疏索引:稀疏索引叶子节点只保存了该索引所需的键值


区别就是:
密集索引可以直接找到键值相关的数据,无需再进行下一步的查找
稀疏索引则需要根据叶子节点拿到的主键再查找想要的数据

InnoDB引擎支持哈希索引吗



而mysql的InnoDB引擎会在用户常查询的数据段上加入哈希索引
以提高执行效率(能快速定位某个特定的值的特性

InnoDB和MyISAM区别:


InooDB引擎必须有一个密集索引:
主键被定义,则主键作为密集索引
若没有主键被定义,则第一个唯一的非空索引作为密集索引
若没有以上条件,InnoDB会生成一个隐藏主键作为密集索引

InnoDB是密集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。

MyISAM是稀疏索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的索引保存的是数据文件的指针。主键索引和辅助索引是独立的。


联合索引的最左匹配原则

联合索引演示:

KEY `index_and`(`area`,`title`)//联合索引
KEY `index_and`(`area`)//普通索引

如上所示,
当你使用select语句单独查询area参数或同时查询areatitle时,将会使用index_and索引,但当你单独查询title时,将不使用index_and联合索引,而转而用全表搜索,这个就称之为最左匹配原则

最左匹配原则是非常重要的原则,
mysql会一直向右匹配直到遇到范围查询(between、like、>、<)
如:

a=3 and b=4 and c>5 and d=6

将会执行到b就停止,d是用不到索引的

而=和in的顺序无所谓,它会由mysql查询优化器帮你索引识别顺序


成因:最左匹配原则是为了更好地定位B+树中索引位置

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容