【转】Mysql索引失效的情况
在工作中经常能遇到索引失效的情况,只要索引失效就导致了SQL查询慢,服务响应慢,用户体验差的情况;所以下面我们就讨论一下MySQL中索引失效的情况
口诀
- 全职匹配我最爱,最左前缀要遵守;
- 带头大哥不能死,中间兄弟不能断;
- 索引列上少计算,范围之后全失效;
- LIKE百分写最右,覆盖索引无所谓;
- 不等空值还有 OR,索引影响要注意;
- VAR 引号不可丢,SQL 优化有诀窍。
1.首先创建表
create table 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'入职时间'
-> )charset utf8 comment '员工记录表';
2.添加测试数据
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());
3.创建索引
mysql> create index idx_staffs_nap on staffs(name,age.pos);
4.查看索引
mysql> show index from staffs;

EXPLAIN查看执行过程时,type是查询的访问类型。
结果值从最好到最坏依次是(缩略版):
System > const > eq_ref > ref > range > index > ALL
5.口诀解释
5.1 全职匹配我最爱
最理想的情况就是查询条件刚好和索引完全匹配

5.2 带头大哥不能死
第一条sql中使用了头索引,type为ref,
而第二条sql中第一个索引没有使用,所以type 为最坏类型ALL 并且key为NULL

5.3 中间兄弟不能断
可以看到第二条sql中key为74 是因为索引中断造成的而第一行的sql中包含name,age,pos

5.4 索引列上少计算
不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
可以看到当使用left(name,4) 函数时索引失效

5.5 范围之后全失效
可以看到使用" > "后索引类型由ref ->>range
key_len由140–>78
是因为age>24导致索引失效
mysql在执行sql时底层会使用Optimizer(查询优化器)优化语句使之改成explain select * from staffs where name=‘July’ and pos =‘manager’ and age>24 ;
所以也就是为什么age>24在中间位置,而范围后全失效后,key_len是78 (两个索引)而不是一个索引的原因

5.6 like百分写最右
“ % ”要写在右面以免造成索引失效

5.7 覆盖索引无所谓
解决
like’%字符串%’索引不被使用的方法
使用覆盖索引

5.8 不等空值还有 OR
- 不等于

- NULL值

- 少用 or

5.9 var引号不要丢
因为在mysql底层,会把2000转换为字符类型,进行了一次类型转换

5.10 sql优化有诀窍
mysql在执行sql时底层会使用Optimizer(查询优化器)优化语句
【转】Mysql索引失效的情况的更多相关文章
- mysql索引失效的情况
1.WHERE字句的查询条件里有不等于号(如:WHERE column!=...),MYSQL将无法使用索引: 2.WHERE字句的查询条件里使用了函数的列(如:WHERE DAY(column)=. ...
- mysql索引总结(4)-MySQL索引失效的几种情况
mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...
- 面试突击60:什么情况会导致 MySQL 索引失效?
为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景. explain 使用如下,只需要在查询的 SQL 前面添加上 explain 关键字 ...
- Mysql 索引失效场景
例如:一张USER表 有字段属性 name,age 其中name为索引 下面列举几个索引失效的情况 1. select * from USER where name=‘xzz’ or age= ...
- MySQL索引失效的常见场景
当然请记住,explain是一个好习惯! MySQL索引失效的常见场景 在验证下面的场景时,请准备足够多的数据量,因为数据量少时,MySQL的优化器有时会判定全表扫描无伤大雅,就不会命中索引了. 1. ...
- MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。
索引失效 介绍 索引失效就是我们明明在查询时的条件为索引列(包括自己新建的索引),但是索引不能起效,走的是全表扫描.explain 后可查看type=ALL. 这是为什么呢? 首先介绍有以下几种情况索 ...
- 面试题: MySQL 索引失效的10大原因
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.建表: CREATE TABLE staffs ( id INT PRIMARY KEY AUTO_ ...
- MySQL索引失效的几种情况
1.索引不存储null值 更准确的说,单列索引不存储null值,复合索引不存储全为null的值.索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引, ...
- 【索引失效】什么情况下会引起MySQL索引失效
索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件 ...
- 索引之----mysql单列索引失效的情况
使用的索引名称: 1.隐式转换导致索引失效. 由于表字段定义为vachar类型,但在查询时把该字段作为number类型 以及where条件传给mysql. 2.对索引列进行任何操作(计算(+.-.*. ...
随机推荐
- 学习JavaScript第三天
文章目录 1.数组 1.1创建数组 1.2数组方法 1.3数组遍历 2.函数 2.1函数的定义 2.2函数的参数以及返回值 2.3函数的作用域 2.4函数传参 3.对象 1.数组 在JavaScrip ...
- C++之OpenCV入门到提高003:矩阵的掩膜(Mask)处理
一.介绍 今天是这个系列<C++之 Opencv 入门到提高>得第三篇文章.今天这篇文章也不难,主要介绍如何使用 Opencv 对图像进行掩膜处理,提高图像的对比度.在这个过程中,我们可以 ...
- SQL Server 数据太多如何优化
大家好,我是 V 哥.讲了很多数据库,有小伙伴说,SQL Server 也讲一讲啊,好吧,V 哥做个听话的门童,今天要聊一聊 SQL Server. 在 SQL Server 中,当数据量增大时,数据 ...
- Sublime装sftp远程编辑插件
我平时很喜欢用Sublime来编辑一些脚本软件,本次需要远程编辑Linux上的脚本,需要安装一些插件来完成. Ctrl+Shift+P呼叫出命令行面板后输入 install选择 Install Pac ...
- 卢卡斯定理/Lucas 定理
卢卡斯定理/Lucas 定理 引入 求 \(C_{n+m}^n \mod p\). \(n,m,p \leq 10^5\). 如果直接用阶乘求,可能在阶乘过程中出现了 \(p\),而最后的结果没有出现 ...
- 鸿蒙hvigor构建任务依赖与生命周期简介
Hivgor脚本文件 在构建的生命周期中Hvigor使用两个脚本文件来完成插件.任务以及生命周期hook的注册: hvigorconfig.ts:此文件在整个项目中只有根目录下存在一份,不是构建必须的 ...
- nginx防盗链接的使用
以 local.hyperf.com为例 nginx配置文件如下 # 至少需要一个 Hyperf 节点,多个配置多行 upstream hyperf { # Hyperf HTTP Server 的 ...
- Auto-Encoding Variational Bayes (VAE原文)、变分推理
变分自动编码器的大致概念已经理解了快一年多了,但是其中的数学原理还是没有搞懂,在看到相关的变体时,总会被数学公式卡住.下决心搞懂后,在此记录下我的理解. 公式推导--变分下界 这篇文章提出一种拟合数据 ...
- Select、Poll、Epoll 有什么区别?
部分图片来源于:https://www.cnblogs.com/yanguhung/p/10145755.html I/O模型 BIO:同步阻塞IO 应用程序发起调用以后,一直阻塞,等待结果返回 2. ...
- HTML5 多媒体
1.互联网上的音频 直到现在,仍然不存在一项旨在网页上播放音频的标准. 今天,大多数音频是通过插件(比如 Flash)来播放的.然而,并非所有浏览器都拥有同样的插件. HTML5 规定了在网页上嵌入音 ...