5.MySql索引的使用
2021-04-22 09:34:07 0 举报
AI智能生成
学习笔记
作者其他创作
大纲/内容
作用
创建了索引
并合理的利用了索引
才能提升查询效率
避免失效的索引
准备环境
避免索引失效
全值匹配
对索引中所有列都指定具体值
最左前缀法则
如果是复合索引,则要遵守最左前缀法则
指的是
查询从索引的最左前列开始
并且不跳过索引中的列
匹配最左前缀法则
索引生效
最左前缀原则是发生在复合索引上的
只有复合索引才会有所谓的左和右之分
eg
某表现有索引(a, b, c)
select * from t where a=1 and b=1 and c =1; #这样可以利用到定义的索引(a,b,c),用上a,b,c
select * from t where a=1 and b=1; #这样可以利用到定义的索引(a,b,c),用上a,b
select * from t where b=1 and a=1; #这样可以利用到定义的索引(a,b,c),用上a,b(mysql有查询优化器)
select * from t where a=1; #这样也可以利用到定义的索引(a,b,c),用上a
select * from t where b=1 and c=1; #这样不可以利用到定义的索引(a,b,c)
select * from t where a=1 and c=1; #这样可以利用到定义的索引(a,b,c),但只用上a索引,b,c索引用不到
select * from t where a=1 and b=1; #这样可以利用到定义的索引(a,b,c),用上a,b
select * from t where b=1 and a=1; #这样可以利用到定义的索引(a,b,c),用上a,b(mysql有查询优化器)
select * from t where a=1; #这样也可以利用到定义的索引(a,b,c),用上a
select * from t where b=1 and c=1; #这样不可以利用到定义的索引(a,b,c)
select * from t where a=1 and c=1; #这样可以利用到定义的索引(a,b,c),但只用上a索引,b,c索引用不到
通过最左匹配原则你可以定义一个联合索引
但是使得多数查询条件都可以用到该索引
值得注意的是
当遇到范围查询(>、<、between、like)就会停止匹配
eg
select * from t where a=1 and b>1 and c =1;
#这样a,b可以用到(a,b,c),c索引用不到
索引底层原理
B+树
B+树将所有的非叶子节点的索引都存放在叶子节点
并且还增加了顺序访问的指针
每个叶子节点都有指向相邻叶子节点的指针
这样当其他操作或者大量数据查询时
可以大大减少对I/O磁盘的读取操作
减少对磁盘的I/O操作
所以选B+树更合适作为数据库的索引
包含两种类型结点
内部结点(也称索引结点)
叶子结点
根结点
本身即可以是内部结点
也可以是叶子结点
关键字个数最少可以只有1个
B+树与B树最大的不同
内部结点不保存数据
只用于索引
所有数据(或者说记录)都保存在叶子结点中
m阶B+树表示
内部结点最多有m-1个关键字
或者说内部结点最多有m个子树
阶数m同时限制
叶子结点最多存储m-1个记录
内部结点中的key都按照从小到大的顺序排列
对于内部结点中的一个key
左树中的所有key都小于它
右子树中的key都大于等于它
叶子结点中的记录也按照key的大小排列
每个叶子结点
都存有相邻叶子结点的指针
叶子结点本身
依关键字的大小
自小而大顺序链接
eg
一颗5阶B树的插入过程
5阶B数的结点
最少2个key
最多4个key
避免索引失效
范围查询
范围查询右边的所有列索引将失效
在索引列上进行运算操作
索引失效
底层的隐式类型转换
索引失效
相当于进行了运算操作
eg
字符串要加单引号 ''
尽量使用覆盖索引
避免 select 尽量使用覆盖索引
只访问索引的查询(索引列完全包含查询列)
减/少select*
用or分割开的条件
如果or前的条件中的列有索引
而后面的列中没有索引
那么涉及的索引都不会被用到
以%开头的Like模糊查询
索引失效
如果仅仅是尾部模糊匹配
索引不会失效
如果是头部模糊匹配
索引失效
解决方法
覆盖索引
在 select 中加索引列
0 条评论
下一页