当前位置:网站首页>数据查询必备技能SQL调优:Mysql什么情况下不走索引
数据查询必备技能SQL调优:Mysql什么情况下不走索引
2022-07-19 16:27:00 【游戏编程】
背景分析
今天领导在查询报表时,发现特别慢,于是引发一系列关于sql优化的工作,最终发现是分析同学在进行多表关联时进行不等值关联造成全表扫描,且使用字段无索引造成1W条数据表和20W数据表关联时执行缓慢。但是在MySQL中,并不是你建立了索引,并且你在SQL中使用到了该列,MySQL就肯定会使用到那些索引的,有一些情况很可能在你不知不觉中,你就“成功的避开了”MySQL的所有索引。
mysql哪些查询情况不走索引呢?
1.用
!=
或者<>
导致索引失效
2.类型不一致导致的索引失效
3.函数导致的索引失效 如:SELECT \* FROM user WHERE DATE(create_time) = ‘2020-09-03’
; 如果使用函数在索引列,这是不走索引的。
4.运算符导致的索引失效 SELECT * FROM user WHERE age - 1 = 20; 如果你对列进行了(+,-,\*,/,!)
, 那么都将不会走索引。
5.OR
引起的索引失效 SELECT * FROM user WHERE name = ‘张三’ OR height = ‘175’; OR导致索引是在特定情况下的,并不是所有的OR都是使索引失效,如果OR连接的是同一个字段或者连接的两个字段都有索引,那么索引不会失效,反之索引失效。
6.模糊搜索导致的索引失效 SELECT * FROM user WHERE name LIKE ‘%冰’; 当%放在匹配字段前是不走索引的,放在后面才会走索引。
7.NOT IN、NOT EXISTS导致索引失效
针对不走索引的情况详细分析
1、索引列参与计算,不走索引
SELECT `username` FROM `t_user` WHERE age=20;-- 会使用索引SELECT `username` FROM `t_user` WHERE age+10=30;-- 不会使用索引!!因为所有索引列参与了计算SELECT `username` FROM `t_user` WHERE age=30-10;-- 会使用索引
2、索引列使用函数,可能不走索引
-- 不会使用索引,因为使用了函数运算,原理与上面相同SELECT username FROM t_user WHERE concat(username,'1') = 'admin1'; -- 会使用索引SELECT username FROM t_user WHERE username = concat('admin','1');
3、索引列使用 like 语句,可能不走索引
SELECT * FROM USER WHERE username LIKE 'mysql测试%' --走索引SELECT * FROM USER WHERE username LIKE '%mysql测试' --不走索引SELECT * FROM USER WHERE username LIKE '%mysql测试%' --不走索引
4、数据类型隐式转换,字符串列与数字直接比较,不走索引
-- stock_code字符串类型带索引SELECT * FROM `stock_data` WHERE stock_code = '600538' --走索引SELECT * FROM `stock_data` WHERE stock_code = 600538 --不走索引
5、尽量避免 OR 操作,只要有一个字段没有索引,改语句就不走索引,不走索引!
-- stock_code带索引,open不带索引SELECT * FROM `stock_data` WHERE `stock_code` = '600538' OR `open` = 6.62 -- 不走索引-- stock_code带索引,up_down_pre带索引SELECT * FROM `stock_data` WHERE `stock_code` = '600538' OR `up_down_pre` = 5.1 -- 走索引
6、where id !=2 或者 where id <> 2,不走索引!
SELECT * FROM t_user WHERE username <> 'mysql测试'
7、is null,is not null也无法使用索引,不走索引!
SELECT * FROM t_user WHERE username IS NULL -- 不走索引SELECT * FROM t_user WHERE username IS NOT NULL -- 不走索引
8、索引列使用 in 语句,可能不走索引
-- stock_code数据类型为varcharSELECT * FROM `stock_data` WHERE `stock_code` IN ('600538') -- 走索引SELECT * FROM `stock_data` WHERE `stock_code` IN ('600538','688663','688280') -- 走索引SELECT * FROM `stock_data` WHERE `stock_code` IN (大量数据) -- 不走索引SELECT * FROM `stock_data` WHERE `stock_code` IN (600538) -- 不走索引
对索引失效情况的一些建议,仅供大家有则改之无则加勉
1.没有查询条件,或者查询条件没有建立索引在业务数据库中,特别是数据量比较大的表。
建议:
1 换成有索引的列作为查询条件
2 或者将查询频繁的列建立索引
2.查询结果集是原表中的大部分数据,应该是25%以上
查询的结果集,超过了总数行数25%,优化器觉得就没有必要走索引了。
建议:
1 如果业务允许,可以使用limit控制。
2 结合业务判断,有没有更好的方式。如果没有更好的改写方案
3 尽量不要在mysql存放这个数据了。放到redis里面。
3.索引本身失效,统计数据不真实
索引有自我维护的能力,对于表内容变化比较频繁的情况下,有可能会出现索引失效。
建议:
备份表数据,删除重建相关表
4.查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等)
建议: 减少在mysql中使用加减乘除等计算运算。
5.隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.
索引建立的字段为varchar();select * from stu where name = ‘111';走索引select * from stu where name = 111;不走索引
建议
与研发协商,语句查询符合规范。
6.<> ,not in 不走索引(辅助索引)
建议: 尽量不要用以上方式进行查询,或者选择有索引列为筛选条件。 单独的>,<,in 有可能走,也有可能不走,和结果集有关,
尽量结合业务添加limit or或in 尽量改成union
7.like “%” 百分号在最前面不走
EXPLAIN SELECT * FROM teltab WHERE telnum LIKE ‘31%' 走索引EXPLAIN SELECT * FROM teltab WHERE telnum LIKE ‘%110' 不走索引
建议:
%linux%类的搜索需求,可以使用elasticsearch+mongodb 专门做搜索服务的数据库产品
作者:扫地增
游戏编程,一个游戏开发收藏夹~
如果图片长时间未显示,请使用Chrome内核浏览器。
边栏推荐
- 数据库持久化+JDBC数据库连接
- 什么是企业防火墙,什么是策略?
- JMeter practical operation -- database data drive
- Tiree Tree
- Create the concept of "privacy technology" 360 digital technology helps maintain industry data security
- 玩转时习知NO.10 | 企业知识管理太枯燥?用了它一招解决!
- Oracle 19c迁移遇到大容量lob表怎么办?
- What is enterprise firewall and what is strategy?
- 【300+精选大厂面试题持续分享】大数据运维尖刀面试题专栏(五)
- 如何做好安全开发?
猜你喜欢
FPGA开发第一弹:Vivado软件安装、开发使用与工程建立
webdriver点击登录失效问题的解决
【软件测试】一两个月带出来的新测试人员,到底有多厉害?
数据库架构优化的12种组合方式与风险解读(有书送)
安全合规,优惠不停!高品质出行服务,“享道”给你
精挑细选的100道软测高频面试题,面试前你肯定用得上
食腐秃鹫还是啄木鸟?如何正确理解做空
On the software testing industry -- the correct growth posture of testers
教你使用CANN将照片一键转换成卡通风格
Browser view MD file strongly recommends markdown viewer
随机推荐
Summary of project experience - send it to the friends of the testing post who are doing the project
单元格中出现input时,单元格长度变宽怎么办?
Cut rope
背包问题
asciidoc转markdown
VRRP Technology (detailed explanation)
运行selenium remotedriver时出现与NativeConstructorAccessorImpl.newInstance0错误的SessionNotCreatedException错误
信息学与数学、奥数的关系(2022.07.19)C
蔚小理,从难兄难弟到互相嫌弃
玩转时习知No.7 | 今年过节不学习,学习只学......
js笔记十七:typescript项目的jest项目配置全过程
教你使用CANN将照片一键转换成卡通风格
MIT6.S081-Lab10 mmap [2021Fall]
通过ELK快速搭建集中化日志平台
Go语言——测试与性能
分页存储管理方式
tp5.1 foreach在控制器记录中新增加一个字段,其它字段不变也不用重新全部写一遍 (不在模板中操作)(分页)
PG的表和索引的膨胀(Table & Index Bloat)
Solution of webdriver click login failure
力扣解法汇总731-我的日程安排表 II