MySQL索引失效的几种常见场景
前言
我们在使用MySQL查询数据的时候,总会遇见没有正确使用到索引的情况。
这里我们列举几种常见的,搜索条件使用了索引列却没有走索引的场景。
(以下测试均在MySQL8.0.28中完成,且所有数据均为脚本随机生成)
数据表结构
CREATE TABLE `student_info` (`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,`school_id` int UNSIGNED NOT NULL,`class_id` int UNSIGNED NOT NULL,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,`mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,`create_time` datetime NOT NULL,`last_login_time` datetime NOT NULL,PRIMARY KEY (`id`) USING BTREE,INDEX `idx_school_class`(`school_id` ASC, `class_id` ASC) USING BTREE,INDEX `idx_name`(`name` ASC) USING BTREE,UNIQUE INDEX `uk_mobile`(`mobile` ASC) USING BTREE,INDEX `idx_email`(`email` ASC) USING BTREE,INDEX `idx_last_login_time`(`last_login_time` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
索引列
school_id和class_id字段为一组普通复合索引。
name和last_login_time字段都是普通索引。
mobile字段是唯一索引。
email字段是普通索引,但是字段中可以包含NULL值。
场景
使用LIKE进行左模糊或全模糊查询
例:
SELECT * FROM student_info WHERE `name` LIKE '%安琪';
SELECT * FROM student_info WHERE `name` LIKE '%安%';
索引列发生隐式类型转换
例:
SELECT * FROM student_info WHERE mobile = 17271119709;
数据表中,mobile字段是varchar类型,但是SQL中的条件参数是数值类型,参数类型和字段类型不匹配,无法使用索引,走了全表扫描。
但并非所有情况都如此。
例:
SELECT * FROM student_info WHERE school_id = '101';
SELECT * FROM student_info WHERE id = '10001';
如果数据表中,字段是数值类型,查询的时候使用数值字符串也可以正常使用索引。
复合索引不满足最左匹配原则
例:
SELECT * FROM student_info WHERE class_id = 1001;
我们创建的复合索引是school_id+class_id,如果单纯使用class_id查询,不满足最左匹配,无法使用索引。
查询的时候需要加上school_id来满足匹配条件,或者单独使用school_id查询。
例:
SELECT * FROM student_info WHERE school_id = 101;
SELECT * FROM student_info WHERE school_id = 101 AND class_id = 1001;
错误使用OR关键字
例:
SELECT * FROM student_info WHERE `name` = '顾杰宏' OR create_time = '2021-12-30 02:20:07';
OR左侧的name字段是有索引的,但是右侧的create_time字段没有索引,因此只能走全表扫描。
使用OR查询,需要保证两侧的条件均能正确使用到索引。
例:
SELECT * FROM student_info WHERE `name` = '顾杰宏' OR mobile = '17751393867';
索引列使用函数
使用函数将某一字段中的数据进行转换或处理之后,再和SQL条件进行匹配,会导致无法使用索引。
例:
SELECT * FROM student_info WHERE UNIX_TIMESTAMP(last_login_time) > 1648483200;
索引列参数运算,也属于这种情况的范畴。
例:
SELECT * FROM student_info WHERE id + 1 = 11111;
总结
这里仅仅列举了几种不会使用索引,或绝大多数情况下都不会使用索引的几种场景。
像!=、IN、NOT IN、IS NULL、IS NOT NULL这些查询条件,能否使用索引,和实际数据分布情况有很大关系。
实际应用中,一定要结合EXPLIAN语句,来查看SQL的执行计划。
最后,diss一下那些写了一堆索引失效场景,却不提数据库版本甚至连数据库名字都不说的家伙们吧~
MySQL索引失效的几种常见场景相关推荐
- mysql索引失效_导致MySQL索引失效的几种常见写法
最近一直忙着处理原来老项目遗留的一些SQL优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢SQL,导致MySQL的CPU资源飙升,基于此,给大家简单分享下这些比较使用的易于 ...
- MySQL索引失效的9种情况(针对InnoDB存储引擎)
前言 MySQL中提高查询性能的最有效的方式之一就是对数据表合理的设计索引,优秀的索引的设计方案很大程度上可以提高查询的性能. 因此,索引对查询的速度有着至关重要的影响. 为了尽量的使优化器用到我们的 ...
- MySQL 索引失效的 15 种场景!
背景 无论你是技术大佬,还是刚入行的小白,时不时都会踩到Mysql数据库不走索引的坑.常见的现象就是:明明在字段上添加了索引,但却并未生效. 前些天就遇到一个稍微特殊的场景,同一条SQL语句,在某些参 ...
- 详解MySQL索引失效的几种情况
MySQL索引是提高查询效率的重要手段.索引失效会导致查询效率下降,甚至全表扫描,影响数据库性能.以下是可能导致MySQL索引失效的情况: 1. 使用or操作符 当where语句中使用or操作符并且o ...
- MySQL 索引失效的几种类型以及解决方式
点击下方"Java编程鸭"关注并标星 更多精彩 第一时间直达 索引失效的情况有哪些? 索引列不独立 使用了左模糊 使用 or 查询部分字段没有使用索引 字符串条件没有使用 '' 不 ...
- 索引失效的10种场景,你知道几个呢?(必知五颗星)
目录 前言 1. 准备工作 1.1 创建user表 1.2 插入数据 1.3 查看数据库版本 1.4 查看执行计划 2. 不满足最左匹配原则 2.1 哪些情况索引有效? 2.2 哪些情况索引失效? 3 ...
- 15个必知的Mysql索引失效场景,别再踩坑了
背景 无论你是技术大佬,还是刚入行的小白,时不时都会踩到Mysql数据库不走索引的坑.常见的现象就是:明明在字段上添加了索引,但却并未生效. 前些天就遇到一个稍微特殊的场景,同一条SQL语句,在某些参 ...
- like左匹配索引失效_导致MySQL索引失效的一些常见写法总结
前言 最近一直忙着处理原来老项目遗留的一些SQL优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢SQL,导致MySQL的CPU资源飙升,基于此,给大家简单分享下这些比较使用 ...
- mysql数据索引失效_MySQL索引失效的几种情况
1.索引无法存储null值 a.单列索引无法储null值,复合索引无法储全为null的值. b.查询时,采用is null条件时,不能利用到索引,只能全表扫描. 为什么索引列无法存储Null值? a. ...
最新文章
- AI伪装目标检测:让变色龙现出原形!
- Windows Phone 7 Tips “.NET研究”(4)
- 【Linux】一步一步学Linux——egrep命令(50)
- Java 8日期和时间
- note05-计算机网络
- Mac OSX 平台安装 MongoDB
- python中怎样获得unicode_如何在Python中获取unicode月份名称?
- 当供应链金融遇到区块链会擦出怎样的火花?
- 学习fortran77基础语法
- 自定义函数处理excel单元格列序数
- 机器学习中使用的独热编码
- spice-gtk-0.35源代码解析之spicy解析
- 2009年世界顶级杀毒软件排名
- Flow Ecosystem|Decentology 推出 Flow 在线训练营
- Windows无法自动将IP协议堆栈绑定到网络适配器
- 用友系统由于修改辅助核算导致总账与辅助账对账不平问题解决方法
- 环洋市场咨询:全球自动光学检测设备(AOI)收入预计2028年达到40.27亿美元
- 产业链图谱:2021年中国新能源汽车产业链图谱|产业链全景图
- JAVA导出shape文件zip
- GPT专业应用:生成电影解说词