在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中存储引擎的区别及比较
Jun 04 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
MySQL数据库必备之条件查询语句
Oct 15 MySQL
MySQL 主从复制数据不一致的解决方法
Mar 18 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
Apr 10 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
MySQL中的全表扫描和索引树扫描
May 15 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
Mysql中mvcc各场景理解应用
Aug 05 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 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
德生H-501的评价与改造
2021/03/02 无线电
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
javascript关于继承解析
2016/05/10 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
js实现放大镜特效
2017/05/18 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
如何用python整理附件
2018/05/13 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
python装饰器代替set get方法实例
2019/12/19 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
node中使用shell脚本的方法步骤
2021/03/23 Javascript
应用艺术专业个人的自我评价
2014/01/03 职场文书
公务员职业生涯规划书范文  
2014/01/19 职场文书
模范教师事迹材料
2014/02/10 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技