MySQL索引优化(二)索引失效
本文主要说的是索引失效问题
创建表
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索引优化(二)索引失效相关推荐
- mysql优化器放弃索引场景,MYSQL索引优化(索引失效场景)
学习mysql是作为一名Java工程师必不可少的事情,但是我们只认识mysql的增删查改建表等等的sql语句其实远远不够的,对于进阶mysql来说,索引是一个很重要的部分.下面我们就来说一下在mysq ...
- MySQL索引优化:索引失效以及不适合建立索引的场景
引言: 索引是有双面性的,合理的建立索引可以提高数据库的效率.但是如果没有合理的构建索引和使用索引,可能会导致索引失效或者影响数据库性能,本文主要讨论的是索引失效以及不适合建立索引的场景 结论:具体案 ...
- 023 MySQL索引优化口诀-索引失效的常见情况
索引优化总结口诀: 全值匹配我最爱,最左前缀要遵守: 带头大哥不能死,中间兄弟不能断: 索引列上少计算,范围之后全失效: like 百分写最右, 覆盖索引不写 * : 不等控制还有or,索引失效要少用 ...
- MySQL 性能优化,索引和查询优化
https://my.oschina.net/qrmc/blog/1822373 要知道为什么使用索引,要知道如何去使用好索引,使自己的查询达到最优性能,需要先了解索引的数据结构和磁盘的存取原理 1. ...
- mysql的索引优化_MySQL索引优化与分析(重要)
建表SQL CREATE TABLE staffs ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR (24) NULL DEFAULT '' COM ...
- mysql 索引优化 2_MySQL2索引优化
索引 无论在工作中,还是在面试当中,数据库优化是一个避不开的技术点,关于数据库的优化,有如下几点: (1)优化表结构,对常用的字段和非常用的字段分开存储: (2)优化SQL,合理使用索引: (3)做数 ...
- mysql如何优化联合索引abc使用
目录 一.数据背景 二.key-len列的计算规则 三.SQL执行测试 1)sql执行 a,b,c字段都存在 2)sql执行 a,b,c部分索引字段为查询条件 3)针对条件,优化索引 四.总结 mys ...
- 查询索引MySQL性能优化 查询索引
时光紧张,先记一笔,后续优化与完善. MySQL能性优化 能性优化是通过某些有效的方法来高提MySQL的行运速度,增加占用的磁盘空间.能性优化含包很多方面,例如优化查询速度,优化新更速度和优化MySQ ...
- 【MySQL优化(六)】InnoDB索引优化与索引规约
序 上一篇讲解了建表规范后,本章重点分析下创建索引的一些规范 由于索引是工作在存储引擎层,所以以下规约都是基于InnoDB引擎 题外话 在满足语句需求的情况下, 尽量少地访问/消耗资源是数据库设计的重 ...
- MySQL性能优化,索引优化
优化需求: 稳定性和业务可持续性,比性能更加重要!!! sql性能优化: SQL及索引 > 数据库表结构 > 系统配置 > 硬件 数据库表结构:分库分表,读写分离,存储引擎,表设计 ...
最新文章
- 微型计算机三包法第30条内容,我不同意国家对电视机三包有明确规定,还是检测手段有问题。保修内容明确维护好消费者的权益。- 法律快车法律咨询...
- Java架构师成长之道之浅谈计算机系统架构
- 最强 AWS 的十条军规,首席技术官总结过去十年的经验
- ML之LiR:机器学习经典算法之线性回归算法LiR的简介、使用方法、经典案例之详细攻略
- 高斯消去法c++_高斯消去法的算法改进
- 反向传播算法 Backpropagation Algorithm
- 2019ICPC(沈阳) - Flowers(二分)
- ubuntu19.10安装deepin的微信和qq(转载+自己在新系统上验证)
- 为什么我的会话状态在ASP.NET Core中不工作了?
- 分段线性插值c语言程序_【短道速滑】OpenCV中cvResize函数使用双线性插值缩小图像长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。...
- Codeforces #345 Div.1
- nginx+php fpm日志报错信息
- IDEA中用maven打出的jar包只有一个META-INF文件夹,没有java的源码???
- 鸿蒙2.0公测版支持机型,华为鸿蒙2.0露真容,公测版支持机型公布
- 电子信息工程四年学习之思
- linux下查看U盘文件
- 老农的计算机学习笔记(二)硬件篇
- 声学模型训练-LDA算法
- android killer使用方法,AndroidKiller安装、设置及使用教程
- php curl 客户端,php通过curl设置客户端cookie