在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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
mysql联合索引的使用规则
Jun 23 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
MySQL基础快速入门知识总结(附思维导图)
Sep 25 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
Mysql如何实现不存在则插入,存在则更新
Mar 25 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
MySQL中一条SQL查询语句是如何执行的
Apr 08 MySQL
MySQL三种方式实现递归查询
Apr 18 MySQL
Mysql 如何合理地统计一个数据库里的所有表的数据量
Apr 18 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 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修改session_id示例代码
2014/01/08 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
2016/12/19 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
React组件生命周期详解
2017/07/03 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
nodejs实现截取上传视频中一帧作为预览图片
2017/12/10 NodeJs
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
python中的闭包用法实例详解
2015/05/05 Python
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
python实现xml转json文件的示例代码
2020/12/30 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
Farah官方网站:男士服装及配件
2019/11/01 全球购物
应届生求职推荐信
2013/10/28 职场文书
企划专员岗位职责
2013/12/09 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
2014年科技工作总结
2014/11/26 职场文书
婚礼答谢词
2015/01/04 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
Smart 2 车辆代号 HC11 全新谍照曝光
2022/04/21 数码科技