网站首页 > 技术文章 正文
索引列上做操作导致索引失效
通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算、函数、类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的使用索引,且不让索引失效
查看表索引
mysql>show index from user;
我们看到user表中创建的是一个符合索引,索引顺序name、age、pos
案例分析
举例:两条sql语句查询出来的结果是一样的,但实际在mysql底层执行过程中效率确实完全不一致的
- 使用explain查看执行结果
mysql>explain select * from user where name="tim";
ref解释:表里面哪些字段走了索引(如果索引是主键或者唯一索引的话,会显示 const),最后选出了数据(选择行,一行一行的数据),连接不能基于关键字选择单个行,可能查找 到多个符合条件的行。 叫做 ref 是因为索引要 跟某个参考值相比较。这个参考值或者是一 个常数,或者是来自一个表里的多表查询的 结果值。
结论:从执行结果看,我们明显的使用到了索引(type=ref),且检索的行为1行,用到的ref为常量const
- 使用explain查看在所有列上计算的执行结果
mysql>explain select * from user where left(name,3)="tim";
结论:我们看到执行结果是没有使用到索引且是全表扫描(type=All),我们看到ref为NULL
建议:
1、作为一个资深的程序员,为了能和DBA配合默契,在实际生产环境中,我们写的每一条sql语句都需要我们自己explain查看执行结果,写出高效且执行效率最高的sql语句。
2、另外如果我们知道如何优化mysql且说出自己在实际生产环境中优化的案例,在面试过程中也会是加分项,这样有助于我们拿到高薪。
注意:切记不要在索引列上进行计算、函数、手动或自动的类型转换,这些都可能会是导致索引失效的元凶,可能我们在测试环境中数据量不大的情况下测试没有问题,可是数据量达到千万级别甚至更大的情况下执行效率就会显而易见,有可能因为一条特别慢的sql拖垮整个服务。
点击关注发私信或评论交流文章中有问题的地方,相互学习和答疑
猜你喜欢
- 2024-10-28 MySQL查询为什么没走索引?这篇文章带你全面解析
- 2024-10-28 什么情况会导致 MySQL 索引失效?(mysql什么情况下会导致索引失效)
- 2024-10-28 用了索引一定就有用吗?如何排查?(使用索引)
- 2024-10-28 MySQL 索引优化分析:为啥你的SQL慢?为啥你建的索引常失效?
- 2024-10-28 MySQL基础(索引分析和使用)(mysql各种索引的使用场景)
- 2024-10-28 MySQL基础(其它SQL优化)(mysql数据库优化及sql调优)
- 2024-10-28 除了网络问题之外,即使对于数据量较小的表
- 2024-10-28 研究了 4.7 个小时终于了解到了索引使用了却没变快的原因
- 2024-10-28 MySQL索引失效带来的性能瓶颈:如何解决这个棘手问题?
- 2024-10-28 常见mysql索引失效条件(常见mysql索引失效条件是什么)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)