在MySQL中你成功的避开了所有索引


Posted in MySQL onApril 20, 2022

前言

在MySQL中,并不是你建立了索引,并且你在SQL中使用到了该列,MySQL就肯定会使用到那些索引的,有一些情况很可能在你不知不觉中,你就“成功的避开了”MySQL的所有索引。

mysql哪些查询情况不走索引

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数据类型为varchar
SELECT * 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 专门做搜索服务的数据库产品

总结

到此这篇关于mysql哪些查询情况不走索引的文章就介绍到这了!

MySQL 相关文章推荐
Mysql - 常用函数 每天积极向上
Apr 05 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
正确使用MySQL update语句
May 26 MySQL
MySQL 外键约束和表关系相关总结
Jun 20 MySQL
MySQL 5.7常见数据类型
Jul 15 MySQL
MySQL 那些常见的错误设计规范,你都知道吗
Jul 16 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
MySQL数据管理操作示例讲解
Dec 24 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 #MySQL
mysql 8.0.27 绿色解压版安装教程及配置方法
MySQL去除密码登录告警的方法
Apr 20 #MySQL
MySQL数据库事务的四大特性
Windows 64位 安装 mysql 8.0.28 图文教程
分析MySQL优化 index merge 后引起的死锁
解决MySQL报“too many connections“错误
You might like
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
PHP检测用户语言的方法
2015/06/15 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
php正则修正符用法实例详解
2016/12/29 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
javascript 清空form表单中某种元素的值
2009/12/26 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
python 上下文管理器使用方法小结
2017/10/10 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
PyTorch基本数据类型(一)
2019/05/22 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
Python hashlib模块的使用示例
2020/10/09 Python
python 制作磁力搜索工具
2021/03/04 Python
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
廉政教育心得体会
2014/01/01 职场文书
班主任新年寄语
2014/04/04 职场文书
高中教师评语大全
2014/04/25 职场文书
岗位安全生产责任书
2014/07/28 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
公司催款律师函
2015/05/27 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
Pytorch可视化的几种实现方法
2021/06/10 Python
anaconda python3.8安装后降级
2021/06/11 Python
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis