一张图搞懂MySQL的索引失效

全值匹配(索引最佳)

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

  

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

  

1、违反最左前缀法则

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

  

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

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

  

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

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

  

4、尽量使用覆盖索引

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

  

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

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

  

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

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

  

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

  

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

explain select * from user where name = 2000;

  

8、or连接

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

  

9、order by

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

  

导致额外的文件排序(会降低性能)
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;//含非索引字段

  

10、group by

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

  

导致产生临时表(会降低性能)
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> 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

  

了解更多SQL常见问题及解决方式请查看原文:https://developer.aliyun.com/article/741403?utm_content=g_1000097870

原文地址:https://www.cnblogs.com/huwling/p/12144517.html

时间: 2024-11-07 11:19:59

一张图搞懂MySQL的索引失效的相关文章

一张图搞懂分布式大型网站的前世今生

大型的网站都是从小网站一步一步发展过来的,每个阶段都随着访问量的不断上涨面临不同的问题,以下是根据某本书整理出来的网站发展历程及其用到的技术,供大家参考: 一张图搞懂分布式大型网站的前世今生

一张图搞懂容器所有操作 - 每天5分钟玩转 Docker 容器技术(26)

前面我们已经讨论了容器的各种操作,对容器的生命周期有了大致的理解,下面这张状态机很好地总结了容器各种状态之间是如何转换的. 如果掌握了前面的知识,要看懂这张图应该不难.不过有两点还是需要补充一下: 可以先创建容器,稍后再启动. ① docker create 创建的容器处于 Created 状态.② docker start 将以后台方式启动容器. docker run 命令实际上是 docker create 和 docker start 的组合. 只有当容器的启动进程 退出 时,--rest

一张图搞懂Ajax原理

本文整理在,我的github上.欢迎Star. 原理 说起ajax,就不得不说他背后的核心对象XMLHttpRequest,而说到XMLHttpRequest我觉得,从它的readyState状态说起是最好的切入点. 个人觉得,只要弄清楚了readyState的这几个状态,其实ajax的原理也就算弄清楚了.为了更方便您理解,笔者特意画了一张状态图. 您只需要看懂这张图ajax原理,您就算通关了:并且很难忘记. 首先let xhr = new XMLHttpRequest();,新建一个XMLHt

4张图搞懂floorMod

在java中floorMod很多人看了官方说明文档仍然不懂,以下用四张图来说明,希望大家能豁然开朗. 原文地址:https://blog.51cto.com/11604910/2372141

一张图搞懂win2008 r2网络负载平衡设置。

一张图看懂Mysql的join连接

INNER JOIN:当两个表中都匹配时返回行. LEFT JOIN:返回左表中的所有行,即使右表中没有匹配项也是如此. RIGHT JOIN:返回右表中的所有行,即使左表中没有匹配项也是如此. FULL JOIN:它结合了左外连接和右外连接的结果.连接表将包含两个表中的所有记录,并填写任何一侧缺少匹配项的NULL. SELF JOIN:用于将表连接到自身,就像表是两个表一样,在SQL语句中临时重命名至少一个表. CARTESIAN JOIN:返回两个或多个连接表中记录集的笛卡尔积. 原文地址:

一张图看懂Function和Object的关系及简述instanceof运算符

我在写一篇图解prototype和__proto__的区别时,搜资料搜到了一个有意思的现象,下面这两个运算返回的结果是一样的: Function instanceof Object;//true Object instanceof Function;//true 这个是怎么一回事呢?要从运算符instanceof说起. 一.instanceof究竟是运算什么的? 我曾经简单理解instanceof只是检测一个对象是否是另个对象new出来的实例(例如var a = new Object(),a i

搞懂MySQL分区

原文:搞懂MySQL分区 一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成. 段 段就是上图的segment区域,常见的段有数据段.索引段.回滚段等,在InnoDB存储引擎中,对段的管理都是由引擎自身所完成的. 区 区就是上图的extent区域,区是由连续的页组成的空间,无论页的大小怎么变,区的大小默认总是为1MB.为了保证区中的页的连续性,InnoDB存储引擎一次从磁盘申请4-5个区,InnoDB页的

一张图看懂ANSYS17.0 流体 新功能与改进

一张图看懂ANSYS17.0 流体 新功能与改进 提交 我的留言 加载中 已留言 一张图看懂ANSYS17.0 流体 新功能与改进 原创2016-02-03ANSYS模拟在线模拟在线 模拟在线 微信号sim_ol 功能介绍这是数值模拟.仿真分析领域最大的公众号,没有之一!!! 点上方“模拟在线”查看更多“牛B”资讯! 感谢ANSYS公司对平台的友情支持,本次17.0的改进报告均为ANSYS提供(授权直接摘抄,确实给小编省事不少啊).本次首先带来是流体方面的改进和优化.后续陆续推送结构.电磁等各方