数据库的索引
索引在数据库中属于十分重要的知识点之一
那么为什么要建立索引呢?
最主要的原因就是:索引能加快数据库的检索速度,它对于存储大量数据的数据表检索速度的提升是十分明显的。
聊一聊为什么索引能加快数据库检索速度
其实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参数或同时查询area
与title
时,将会使用index_and
索引,但当你单独查询title时,将不使用index_and
联合索引,而转而用全表搜索,这个就称之为最左匹配原则
最左匹配原则是非常重要的原则,
mysql会一直向右匹配直到遇到范围查询(between、like、>、<),
如:
a=3 and b=4 and c>5 and d=6
将会执行到b就停止,d是用不到索引的
而=和in的顺序无所谓,它会由mysql查询优化器帮你索引识别顺序
成因:最左匹配原则是为了更好地定位B+树中索引位置