本文主要说的是索引失效问题

创建表

create table if not exists staffs(id int primary key auto_increment,name varchar(24) not null default '' comment '姓名',age int not null default 0 comment '年龄',pos varchar(20) not null default '' comment '职位',add_time timestamp not null default current_timestamp comment '入职时间'
)comment '员工记录表';insert into staffs(name, age, pos, add_time) values ('z3', 22, 'manager', NOW());
insert into staffs(name, age, pos, add_time) values ('July', 23, 'dev', NOW());
insert into staffs(name, age, pos, add_time) values ('2000', 23, 'dev', NOW());

添加索引

alter table staffs add index idx_staffs_nameAgePos(name, age, pos);

1、左前缀法则

先看一个正常的

explain select * from staffs where name = 'July' and age = 23 and pos = 'dev';

结果如下

由ref下的三个const可知,三个索引都被使用到了,key_len的长度也可以体现。说明这个是正常的sql查询。

1)带头索引不能少

name字段的索引是带头索引,这里不使用name字段的索引。

explain select * from staffs where age = 23 and pos = 'dev';

结果如下

可知type类型变成了最糟糕的ALL,且key_len的长度为null,说明三个索引都没有用到。

2)中间索引不能丢

age字段的索引为中间索引,所以使用age字段的索引。

explain select * from staffs where name = 'July' and pos = 'dev';

结果如下

由ref下的一个const可知,索引只使用到了一个,也就是带头索引。

3)结论

综上,如果可以全值匹配就全值匹配(条件字段和索引一样),要遵守左前缀法则,查询从索引的最左前列开始并且不跳过索引中的列。

2、 不在索引列上做任何操作

这里的操作包括计算、函数、类型转换,会导致索引失效而转向全表扫描。

select * from staffs where name = 'July';
select * from staffs where left(name, 4) = 'July';

执行这两条sql都可以得到想要的结果。

执行

explain select * from staffs where left(name, 4) = 'July';

结果如下

会发现索引失效了。

3、 少用范围查询

执行

explain select * from staffs where name = 'July' and age = 23;
explain select * from staffs where name = 'July' and age > 23;

结果如下

type类型由ref降低为range。

4、减少使用select *

尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *

explain select * from staffs where name = 'July' and age = 23;


只取想要的数据。

explain select name, age, pos from staffs where name = 'July' and age = 23;

结果如下

Extra出现了Using index,表明性能更优了。

5、不等于

使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描。

explain select * from staffs where name = 'July' and age != 23;


type变为ALL,索引失效了。

6、is null,is not null

is null,is not null也无法使用索引。

explain select * from staffs where name = 'July' and age is null;


创建字段的时候,尽量避免空值null。

6、like和通配符

like以通配符开头(%abc)索引也会失效,变成全表扫描。
分别执行

explain select * from staffs where name = 'July';
explain select * from staffs where name like 'July';
explain select * from staffs where name like '%July';

结果如下

可以看见第三条sql的索引失效。所以like的时候,百分号加右边。

如何解决like ‘%字符串%’ 时索引不会被使用?
使用覆盖索引即可解决(只要查询的字段是索引字段即可)。

可以看到type变为了index,性能比ALL好了不少。

7、 字符串不加单引号

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

explain select * from staffs where name = 2000;

结果如下

type变成了ALL,这里也说明了MySQL底层会自动进行类型转换,隐性自动类型转换,也是我们需要避免的。
字符串不加单引号还会导致一个很严重的问题,就是行锁会升级为表锁。

8、 少用or

or也会导致索引失效。

 explain select * from staffs where name = 'July' or name = 'z3';


可见索引失效了。

9、

MySQL索引优化(二)索引失效相关推荐

  1. mysql优化器放弃索引场景,MYSQL索引优化(索引失效场景)

    学习mysql是作为一名Java工程师必不可少的事情,但是我们只认识mysql的增删查改建表等等的sql语句其实远远不够的,对于进阶mysql来说,索引是一个很重要的部分.下面我们就来说一下在mysq ...

  2. MySQL索引优化:索引失效以及不适合建立索引的场景

    引言: 索引是有双面性的,合理的建立索引可以提高数据库的效率.但是如果没有合理的构建索引和使用索引,可能会导致索引失效或者影响数据库性能,本文主要讨论的是索引失效以及不适合建立索引的场景 结论:具体案 ...

  3. 023 MySQL索引优化口诀-索引失效的常见情况

    索引优化总结口诀: 全值匹配我最爱,最左前缀要遵守: 带头大哥不能死,中间兄弟不能断: 索引列上少计算,范围之后全失效: like 百分写最右, 覆盖索引不写 * : 不等控制还有or,索引失效要少用 ...

  4. MySQL 性能优化,索引和查询优化

    https://my.oschina.net/qrmc/blog/1822373 要知道为什么使用索引,要知道如何去使用好索引,使自己的查询达到最优性能,需要先了解索引的数据结构和磁盘的存取原理 1. ...

  5. mysql的索引优化_MySQL索引优化与分析(重要)

    建表SQL CREATE TABLE staffs ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR (24) NULL DEFAULT '' COM ...

  6. mysql 索引优化 2_MySQL2索引优化

    索引 无论在工作中,还是在面试当中,数据库优化是一个避不开的技术点,关于数据库的优化,有如下几点: (1)优化表结构,对常用的字段和非常用的字段分开存储: (2)优化SQL,合理使用索引: (3)做数 ...

  7. mysql如何优化联合索引abc使用

    目录 一.数据背景 二.key-len列的计算规则 三.SQL执行测试 1)sql执行 a,b,c字段都存在 2)sql执行 a,b,c部分索引字段为查询条件 3)针对条件,优化索引 四.总结 mys ...

  8. 查询索引MySQL性能优化 查询索引

    时光紧张,先记一笔,后续优化与完善. MySQL能性优化 能性优化是通过某些有效的方法来高提MySQL的行运速度,增加占用的磁盘空间.能性优化含包很多方面,例如优化查询速度,优化新更速度和优化MySQ ...

  9. 【MySQL优化(六)】InnoDB索引优化与索引规约

    序 上一篇讲解了建表规范后,本章重点分析下创建索引的一些规范 由于索引是工作在存储引擎层,所以以下规约都是基于InnoDB引擎 题外话 在满足语句需求的情况下, 尽量少地访问/消耗资源是数据库设计的重 ...

  10. MySQL性能优化,索引优化

    优化需求: 稳定性和业务可持续性,比性能更加重要!!! sql性能优化: SQL及索引 > 数据库表结构 > 系统配置 > 硬件 数据库表结构:分库分表,读写分离,存储引擎,表设计 ...

最新文章

  1. 微型计算机三包法第30条内容,我不同意国家对电视机三包有明确规定,还是检测手段有问题。保修内容明确维护好消费者的权益。- 法律快车法律咨询...
  2. Java架构师成长之道之浅谈计算机系统架构
  3. 最强 AWS 的十条军规,首席技术官总结过去十年的经验
  4. ML之LiR:机器学习经典算法之线性回归算法LiR的简介、使用方法、经典案例之详细攻略
  5. 高斯消去法c++_高斯消去法的算法改进
  6. 反向传播算法 Backpropagation Algorithm
  7. 2019ICPC(沈阳) - Flowers(二分)
  8. ubuntu19.10安装deepin的微信和qq(转载+自己在新系统上验证)
  9. 为什么我的会话状态在ASP.NET Core中不工作了?
  10. 分段线性插值c语言程序_【短道速滑】OpenCV中cvResize函数使用双线性插值缩小图像长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。...
  11. Codeforces #345 Div.1
  12. nginx+php fpm日志报错信息
  13. IDEA中用maven打出的jar包只有一个META-INF文件夹,没有java的源码???
  14. 鸿蒙2.0公测版支持机型,华为鸿蒙2.0露真容,公测版支持机型公布
  15. 电子信息工程四年学习之思
  16. linux下查看U盘文件
  17. 老农的计算机学习笔记(二)硬件篇
  18. 声学模型训练-LDA算法
  19. android killer使用方法,AndroidKiller安装、设置及使用教程
  20. php curl 客户端,php通过curl设置客户端cookie

热门文章

  1. TNS-12535,TNS-00505,ORA-3136报错信息处理
  2. 微信小程序实现文字识别-ocr插件
  3. CMU 15-445/645 数据库系统Lab 1 现代C++练习项目
  4. 深度USB启动盘制作工具(用u盘装系统)
  5. Unity API常用方法和类
  6. selenium IDE 遇到 Preparing to run your test 问题的解决
  7. AD18 PCB高亮
  8. ODL Netconf 连接器 + Netopeer
  9. 第七章、Groovy面向对象
  10. uva 11134 Fabled Rooks