MySQL复合索引中七种常见的索引失效情形
#数据库说明
使用的table emp如下:
CREATE TABLE emp(id INT(11) NOT NULL AUTO_INCREMENT,empno INT NOT NULL,NAME VARCHAR(20) DEFAULT NULL,age INT(3) DEFAULT NULL,deptid INT(11) DEFAULT NULL,PRIMARY KEY (id)
)
ENGINE = INNODB AUTO_INCREMENT=1 DEFAULT CHARSET =utf8;
然后在其中随机插入500000条数据
尝试建立age_name_deptid顺序的复合索引,并查询执行情况
CREATE INDEX idx_age_name_deptid ON emp(age, NAME, deptid);EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.`age`=30
AND emp.name='abcd'
AND emp.`deptid`=4;
结果如下:
以上为索引正常使用情况,可以看到在使用索引后,物理行由500000减少到1,提高了效率。下面以此为基础介绍七种索引失效情形
**
1. 情形1 第一个位置缺少查询项
**
CREATE INDEX idx_age_name_deptid ON emp(age, NAME, deptid);EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.name='abcd' AND emp.`deptid`=4;
结果如下:
物理行rows接近500000,可见查询结果为全表查询
2. 情形2 索引中断,则中断后面部分的索引无效
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 AND emp.`deptid`=4;
结果如下:
可见,虽然查询的物理行下降到4万多,但比全表扫描效率高,但比最佳情况要差。这是因为已建立的索引顺序为age_name_deptid,而这个查询为age_deptid,在name处中断了,中断后的索引失效。
3. 情形3 在索引列上使用函数
CREATE INDEX idx_name ON emp(NAME);EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.`name` LIKE 'abc%';
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE LEFT(emp.`name`,3) = 'abc';
第一条查询结果
第二条查询结果
4. 情形4 存储引擎不能使用索引中范围条件右边的列**
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 AND emp.`deptid`=4 AND emp.name='abcd';
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 AND emp.`deptid`>=4 AND emp.name='abcd';
5. 情形5 出现不等于时不能使用索引
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.`deptid`=4;CREATE INDEX idx_deptid ON emp(deptid);EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.`deptid`=4;
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.`deptid`<>4;
结果如下:
*6. 情形6 is not null无法使用索引,但is null可以使用索引
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age IS NULL;
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age IS NOT NULL;
7. 情形7 like‘%xxx’时索引失效*
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE NAME LIKE 'abc';
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE NAME LIKE 'abc%';
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE NAME LIKE '%abc';
MySQL复合索引中七种常见的索引失效情形相关推荐
- 算法中七种常见的时间复杂度
这是我的推广信息,以激励自己更好的分享自己的知识和经验!也希望看到的你能够多多支持,谢谢! 1. 滴滴云AI大师: 目前滴滴云正在大力推广自己的云计算服务,需要购买的朋友们用我的AI大师码 「2049 ...
- mysql四种常用的索引_四种常见的索引类型
主键索引:数据记录里面不能有 null,数据内容不能重复,在一张表里面不能有 多个主键索引. 普通索引:使用字段关键字建立的索引,主要是提高查询速度 唯一索引:字段数据是唯一的,数据内容里面能否为 n ...
- MySQL 性能优化:8 种常见 SQL 错误用法!
声明:转载自 MySQL 性能优化:8 种常见 SQL 错误用法! 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是 ...
- Java中 9 种常见的 CMS GC 问题分析与解决
目录 Java中 9 种常见的 CMS GC 问题分析与解决 1. GC 1.1 引言 1.2 概览 2. GC 基础 2.1 基础概念 2.2 JVM 内存划分 2.3 分配对象 2.4 收集对象 ...
- IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解
IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解 0.前言 一.光学传感器模块: 1. 光敏传感器模块: 2. 红外避障模块 3. 循迹传感器模块 4. U型光电传感器模块 5. 红外接收模 ...
- 七种常见的数据分析法之:可行域分析
导读 福格模型的触发有效区,我们就将其称之为可行域.那么,可行域分析该怎么用呢? 大数据产业创新服务媒体 官网 | www.datayuan.cn 今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC ...
- 七种常见的数据分析方法拆解
数据分析一直是互联网人辨别方向的不二法门,我们通过对数据的观测来判断事物的发展趋势,也常常利用数据的思维来辩证的为决策做参考. 下面就给大家详细拆解七种常见的数据分析法,让我们的数据分析少走弯路. 0 ...
- 七种常见的排序算法总结
目录 引言 1.什么是排序? 2.排序算法的目的是什么? 3.常见的排序算法有哪些? 一,插入排序 1.基本思想 2.代码实现 3.性能分析 4.测试 二,希尔排序(缩小增量排序) 1.基本思想 2. ...
- Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面、索引行复合索引中的一个切面
Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面.索引行复合索引中的一个切面 目录
最新文章
- python中国大学排名爬虫写明详细步骤-Python之爬虫-中国大学排名
- Thread.currentThread().getContextClassLoader().getResourceAsStream()读取配置文件
- uboot中变量env(收集)
- Intellij idea添加单元测试工具
- 阿里如何面试MySQL优化CPU消耗
- Java面试汇总:Java基础(一)
- linux dns区域传送,Linux DNS服务器主从复制及区域传送
- 测试面试话题4: 如何制定测试计划
- 4、Spring Cloud-负载均衡 Ribbon
- Debian - RAID5搭建(热备)
- Gitlab-API各状态码解释
- 图书租赁管理系统 图书馆借书还书 计算机毕设项目
- MongoDB创建数据库
- 中美科学家造出“人-猴胚胎”,这会是魔幻剧情的开端吗?
- C#设计模式(22)——访问者模式(Vistor Pattern)
- dns服务器地址显示fec0,DNS服务器地址为fec0
- Django之自定义 form 表单上传图片
- c++ 正则表达式验证手机号码
- warning: implicit declaration of function ‘XXX’; did you mean ‘YYY’? [-Wimplicit-function-declarati
- eacharts和eacharts-gl、3d饼图、3d柱状图加折线图、下载gl报错解决