一张图搞懂MySQL的索引失效

哑域封装
• 阅读 42838
索引对于MySQL而言,是非常重要的篇章。索引知识点也巨多,要想掌握透彻,需要逐个知识点一一击破,今天来先来聊聊哪些情况下会导致索引失效。

图片总结版

一张图搞懂MySQL的索引失效

全值匹配(索引最佳)

explain select * from user where name = 'zhangsan' and age = 20 and pos = 'cxy' and phone = '18730658760';

一张图搞懂MySQL的索引失效

和索引顺序无关,MySQL底层的优化器会进行优化,调整索引的顺序
explain select * from user where name = 'zhangsan' and age = 20 and pos = 'cxy' and phone = '18730658760';

一张图搞懂MySQL的索引失效

1、违反最左前缀法则

如果索引有多列,要遵守最左前缀法则
即查询从索引的最左前列开始并且不跳过索引中的列
explain select * from user where age = 20 and phone = '18730658760' and pos = 'cxy';

一张图搞懂MySQL的索引失效

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

如计算、函数、(自动or手动)类型转换等操作,会导致索引失效从而全表扫描
explain select * from user where left(name,5) = 'zhangsan' and age = 20 and phone = '18730658760';

一张图搞懂MySQL的索引失效

3、索引范围条件右边的列

索引范围条件右边的索引列会失效
explain select * from user where name = 'zhangsan' and age > 20 and pos = 'cxy';

一张图搞懂MySQL的索引失效

4、尽量使用覆盖索引

只访问索引查询(索引列和查询列一致),减少select*
explain select name,age,pos,phone from user where age = 20;

一张图搞懂MySQL的索引失效

5、使用不等于(!=、<>)

mysql在使用不等于(!=、<>)的时候无法使用索引会导致全表扫描(除覆盖索引外)
explain select * from user where age != 20;
explain select * from user where age <> 20;

一张图搞懂MySQL的索引失效

一张图搞懂MySQL的索引失效

6、like以通配符开头('%abc')

索引失效
explain select * from user where name like '%zhangsan';

一张图搞懂MySQL的索引失效

索引生效
explain select * from user where name like 'zhangsan%';

一张图搞懂MySQL的索引失效

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

explain select * from user where name = 2000;

一张图搞懂MySQL的索引失效

8、or连接

少用or
explain select * from user where name = '2000' or age = 20 or pos ='cxy';

一张图搞懂MySQL的索引失效

9、order by

正常(索引参与了排序)
explain select * from user where name = 'zhangsan' and age = 20 order by age,pos;
备注:索引有两个作用:排序和查找

一张图搞懂MySQL的索引失效

导致额外的文件排序(会降低性能)
explain select name,age from user where name = 'zhangsan' order by pos;//违反最左前缀法则
explain select name,age from user where name = 'zhangsan' order by pos,age;//违反最左前缀法则
explain select * from user where name = 'zhangsan' and age = 20 order by created_time,age;//含非索引字段

一张图搞懂MySQL的索引失效

一张图搞懂MySQL的索引失效

一张图搞懂MySQL的索引失效

10、group by

正常(索引参与了排序)
explain select name,age from user where name = 'zhangsan' group by age;
备注:分组之前必排序(排序同order by)

一张图搞懂MySQL的索引失效

导致产生临时表(会降低性能)
explain select name,pos from user where name = 'zhangsan' group by pos;//违反最左前缀法则
explain select name,age from user where name = 'zhangsan' group by pos,age;//违反最左前缀法则
explain select name,age from user where name = 'zhangsan' group by age,created_time;//含非索引字段

一张图搞懂MySQL的索引失效

一张图搞懂MySQL的索引失效

一张图搞懂MySQL的索引失效

使用的示例数据

mysql> show create table user \G
******************************************************
       Table: user
Create Table: CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(10) DEFAULT '0',
  `pos` varchar(30) DEFAULT NULL,
  `phone` varchar(11) DEFAULT NULL,
  `created_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name_age_pos_phone` (`name`,`age`,`pos`,`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
点赞
收藏
评论区
推荐文章
MySql索引下推知识分享
作者:刘邓忠Mysql是大家最常用的数据库,下面为大家带来mysql索引下推知识点的分享,以便巩固mysql基础知识,如有错误,还请各位大佬们指正。1什么是索引下推索引下推(IndexConditionPushdown,索引条件下推,简称ICP),是MyS
阿里Java架构师谈:2021年最新Java面试经历
第一家是美团美团的话,三面下来,设计的内容知识也是挺广的吧,有MySQL、Redis、Kafka、线程、算法、、volatile、线程、并发、设计模式等等...一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景,慢查询解决等my
Peter20 Peter20
4年前
什么是索引?Mysql目前主要的几种索引类型
一、索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创
Wesley13 Wesley13
3年前
mysql 知识2
mysql知识2存储引擎1.InnoDB和MYISAM存储引擎的区别?索引1.什么是索引?你知道Mysql有哪些索引?分别介绍一下2.索引的优缺点?那些情况适合建索引那些情况不适合建索引?事务1.什么是事务,它有哪些特性?说一说事务的隔离级别,分别解决了什么问题?
Wesley13 Wesley13
3年前
mysql(索引)
MySQL索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的
Wesley13 Wesley13
3年前
Mysql、Oracle、PostgreSql数据库索引失效场景详细讲解
Mysql、Oracle、PostgreSql数据库索引失效场景详细讲解前言前言Mysql、Oracle、PostgreSql数据库索引失效场景详细讲解。废话不多说直接贴:1、任何计算、函数、类型转换2、!、<3、ISNULL或者ISNOTNULL。类似导致索引失效的还有NOTIN
Wesley13 Wesley13
3年前
mySql索引优化分析
MySQL索引优化分析为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义。助你了解索引,分析索引,使用索引,从而写出更高性能的sql语句。还在等啥子?撸起袖子就是干!案例分析我们先
Wesley13 Wesley13
3年前
MySQL索引背后的数据结构及算法原理
摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文
Stella981 Stella981
3年前
B+Tree索引为什么可以支持千万级别数据量的查找——讲讲mysql索引的底层数据结构
MySQL索引底层数据结构索引是存储引擎快速找到记录的一种数据结构一、有索引与没索引的差距先来看一张图:!(https://static.oschina.net/uploads/img/202010/14150116_INlJ.png)左边是没有索引的情况,右边是作为
3A网络 3A网络
3年前
MySQL 覆盖索引详解
1.什么是索引?索引(在MySQL中也叫“键key”)是存储引擎快速找到记录的一种数据结构,通俗来说类似书本的目录,这个比方虽然被用的最多但是也是最恰如其当的,在查询书本中的某个知识点不借助目录的情况下,往往都找的够呛,那么索引相较于数据库的重要性也可见一斑。2.索引的有哪些种类?索引的种类这里只罗列出InnoDB支持的索引:主键索引(PRIMAR
慢 SQL 优化之索引的作用是什么? | 京东云技术团队
本文针对MySQL数据库的InnoDB存储引擎,介绍其中索引的实现以及索引在慢SQL优化中的作用。本文主要讨论不同场景下索引生效与失效的原因。
哑域封装
哑域封装
Lv1
素衣莫起风尘叹,犹及清明可到家。
文章
4
粉丝
0
获赞
0