在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 24 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
MySQL 隔离数据列和前缀索引的使用总结
May 14 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
MySQL 全文检索的使用示例
Jun 07 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
在MySQL中你成功的避开了所有索引
Apr 20 MySQL
mysql 体系结构和存储引擎介绍
May 06 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
MySQL count(*)统计总数问题汇总
Sep 23 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 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
详解python开发环境搭建
2016/12/16 Python
Python字符串处理实现单词反转
2017/06/14 Python
Python面向对象编程基础解析(一)
2017/10/26 Python
用python做游戏的细节详解
2019/06/25 Python
Python安装selenium包详细过程
2019/07/23 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
Python如何把字典写入到CSV文件的方法示例
2020/08/23 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
平面设计岗位职责
2013/12/14 职场文书
市场营销职业生涯规划书范文
2014/01/12 职场文书
总经理司机岗位职责
2014/02/06 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
安全生产标语
2014/06/06 职场文书
财产保全担保书
2015/01/20 职场文书
教学副校长工作总结
2015/08/13 职场文书
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js