在工作中经常能遇到索引失效的情况,只要索引失效就导致了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

  1. 不等于

  2. NULL值

  3. 少用 or

5.9 var引号不要丢

因为在mysql底层,会把2000转换为字符类型,进行了一次类型转换

5.10 sql优化有诀窍

mysql在执行sql时底层会使用Optimizer(查询优化器)优化语句

【转】Mysql索引失效的情况的更多相关文章

  1. mysql索引失效的情况

    1.WHERE字句的查询条件里有不等于号(如:WHERE column!=...),MYSQL将无法使用索引: 2.WHERE字句的查询条件里使用了函数的列(如:WHERE DAY(column)=. ...

  2. mysql索引总结(4)-MySQL索引失效的几种情况

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  3. 面试突击60:什么情况会导致 MySQL 索引失效?

    为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景. explain 使用如下,只需要在查询的 SQL 前面添加上 explain 关键字 ...

  4. Mysql 索引失效场景

    例如:一张USER表   有字段属性 name,age   其中name为索引 下面列举几个索引失效的情况 1. select * from USER where name=‘xzz’ or age= ...

  5. MySQL索引失效的常见场景

    当然请记住,explain是一个好习惯! MySQL索引失效的常见场景 在验证下面的场景时,请准备足够多的数据量,因为数据量少时,MySQL的优化器有时会判定全表扫描无伤大雅,就不会命中索引了. 1. ...

  6. MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。

    索引失效 介绍 索引失效就是我们明明在查询时的条件为索引列(包括自己新建的索引),但是索引不能起效,走的是全表扫描.explain 后可查看type=ALL. 这是为什么呢? 首先介绍有以下几种情况索 ...

  7. 面试题: MySQL 索引失效的10大原因

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.建表: CREATE TABLE staffs ( id INT PRIMARY KEY AUTO_ ...

  8. MySQL索引失效的几种情况

    1.索引不存储null值 更准确的说,单列索引不存储null值,复合索引不存储全为null的值.索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引, ...

  9. 【索引失效】什么情况下会引起MySQL索引失效

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件 ...

  10. 索引之----mysql单列索引失效的情况

    使用的索引名称: 1.隐式转换导致索引失效. 由于表字段定义为vachar类型,但在查询时把该字段作为number类型 以及where条件传给mysql. 2.对索引列进行任何操作(计算(+.-.*. ...

随机推荐

  1. Power BI 网关无法添加My SQL数据集

    今天第一次发布数据类型为MySQL的数据集到Power BI报表服务器,desktop的连接正常,但是发布到web端后,添加网关时却提示以下错误,如下图所示: 错误信息: 无法创建连接,原因如下: 无 ...

  2. 《JVM第6课》本地方法栈

    1 什么是本地方法 首先要知道什么是本地方法,本地方法并不是 JVM 自己的方法,也不是 jre 里面的方法,而是指那些操作系统自己的方法(如C/C++方法),它们在操作系统目录里.可以这么理解,本地 ...

  3. 计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议

    文章目录 一.TCP/IP五层模型(重要) 二.应用层常见的协议 三.TCP与UDP 3.1 TCP.UDP的区别(重要) 3.2 运行于TCP.UDP上的协议 3.3 TCP的三次握手.四次挥手 3 ...

  4. 4.3 Linux压缩文件或目录为.zip格式(zip命令)

    我们经常会在 Windows 系统上使用 ".zip"格式压缩文件,其实".zip"格式文件是 Windows 和 Linux 系统都通用的压缩文件类型,属于几 ...

  5. C++入门级基础知识汇总

    知识来源:https://www.imooc.com/learn/1304 https://www.runoob.com/cplusplus/cpp-tutorial.html 编程第一步导入头文件: ...

  6. 太强了!14.7K star!Windows系统居然还有开源替代版了?!

    在操作系统的世界里,Windows 系统一直占据着重要的地位.然而,你可能不知道的是,还有一个拥有 14.7K star 的开源替代版 --ReactOS. 1.ReactOS 介绍 ReactOS ...

  7. Python如何根据给定模型计算权值

    在机器学习和深度学习中,模型的权值(或参数)通常是通过训练过程(如梯度下降)来学习和调整的.然而,如果我们想根据一个已经训练好的模型来计算或提取其权值,Python 提供了许多工具和库,其中最常用的是 ...

  8. gal game 杂谈——《GINKA》

    gal game 杂谈--<GINKA> 剧情梳理 Ps:女主分为小学阶段和高中阶段,这里称小学阶段为小时候的女主,高中阶段为大女主,分离出来爱的为GINKA(长相是小时候的女主). 1. ...

  9. 鸿蒙NEXT开发案例:血型遗传计算

    [引言] 血型遗传计算器是一个帮助用户根据父母的血型预测子女可能的血型的应用.通过选择父母的血型,应用程序能够快速计算出孩子可能拥有的血型以及不可能拥有的血型.这个过程不仅涉及到了简单的数据处理逻辑, ...

  10. 【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题

    问题描述 通过FTP的方式,把本地能正常运行的Python Function文件上传到云上后,无法加载函数列表问题. 1:上传 function_app.py,requirements.txt文件到 ...