mysql 联合索引生效的条件及索引失效的条件


Posted in MySQL onNovember 20, 2021

1.联合索引失效的条件

联合索引又叫复合索引。两个或更多个列上的索引被称作复合索引。

对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。 

    利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。

    所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。

    如:建立 姓名、年龄、性别的复合索引。

create table myTest(
         a int,
         b int,
         c int,
         KEY a(a,b,c)
    );

(1)    select * from myTest  where a=3 and b=5 and c=4;   ----  abc顺序
abc三个索引都在where条件里面用到了,而且都发挥了作用

(2)    select * from myTest  where  c=4 and b=6 and a=3;
where里面的条件顺序在查询之前会被mysql自动优化,效果跟上一句一样

(3)    select * from myTest  where a=3 and c=7;
a用到索引,b没有用,所以c是没有用到索引效果的

(4)    select * from myTest  where a=3 and b>7 and c=3;     ---- b范围值,断点,阻塞了c的索引
a用到了,b也用到了,c没有用到,这个地方b是范围值,也算断点,只不过自身用到了索引

(5)    select * from myTest  where b=3 and c=4;   --- 联合索引必须按照顺序使用,并且需要全部使用
因为a索引没有使用,所以这里 bc都没有用上索引效果

(6)    select * from myTest  where a>4 and b=7 and c=9;
a用到了  b没有使用,c没有使用

(7)    select * from myTest  where a=3 order by b;
a用到了索引,b在结果排序中也用到了索引的效果,a下面任意一段的b是排好序的

(8)    select * from myTest  where a=3 order by c;
a用到了索引,但是这个地方c没有发挥排序效果,因为中间断点了,使用 explain 可以看到 filesort

(9)    select * from mytable where b=3 order by a;
b没有用到索引,排序中a也没有发挥索引效果

2.索引失效的条件

  • 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
  • 存储引擎不能使用索引范围条件右边的列
  • 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
  • mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
  • is null,is not null也无法使用索引   ----  此处存在疑问,经测试确实可以使用,ref和const等级,并不是all
  • like以通配符开头('%abc…')mysql索引失效会变成全表扫描的操作。问题:解决like‘%字符串%'时索引不被使用的方法?

mysql 联合索引生效的条件及索引失效的条件

字符串不加单引号索引失效  

SELECT * from staffs where name='2000';  -- 因为mysql会在底层对其进行隐式的类型转换

SELECT * from staffs where name=2000;  --- 未使用索引

一般性建议

  • 对于单键索引,尽量选择针对当前query过滤性更好的索引
  • 在选择组合索引的时候,当前Query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。
  • 在选择组合索引的时候,尽量选择可以能够包含当前query中的where子句中更多字段的索引
  • 尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的

到此这篇关于mysql 联合索引生效的条件及索引失效的条件的文章就介绍到这了,更多相关mysql 联合索引生效内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL基础(一)
Apr 05 MySQL
MySQL pt-slave-restart工具的使用简介
Apr 07 MySQL
MySQL之高可用集群部署及故障切换实现
Apr 22 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
MySQL系列之三 基础篇
Jul 02 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
MySQL创建表操作命令分享
Mar 25 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 #MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 #MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
MySQL中order by的使用详情
Nov 17 #MySQL
关于MySQL中的 like操作符详情
Nov 17 #MySQL
MySQL窗口函数的具体使用
MySQL中varchar和char类型的区别
Nov 17 #MySQL
You might like
杏林同学录(四)
2006/10/09 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
jqPlot Option配置对象详解
2009/07/25 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
javascript解析json实例详解
2014/11/05 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
python+opencv实现动态物体识别
2018/01/09 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
三个python爬虫项目实例代码
2019/12/28 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
买房子个人收入证明
2014/01/16 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
企业培训简报范文
2015/07/20 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书