在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 InnoDB存储引擎的内存管理
Apr 08 MySQL
MySQL查询学习之基础查询操作
May 08 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
mysql升级到5.7时,wordpress导数据报错1067的问题
May 27 MySQL
MySQL库表名大小写的选择
Jun 05 MySQL
mysql中整数数据类型tinyint详解
Dec 06 MySQL
MySQL优化及索引解析
Mar 17 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
MySQL 字符集 character
May 04 MySQL
MySQL GTID复制的具体使用
May 20 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 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设计模式 Proxy (代理模式)
2011/06/26 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
表单元素事件 (Form Element Events)
2009/07/17 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
基于jQuery封装的分页组件
2017/06/26 jQuery
Require.js的基本用法详解
2017/07/03 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
Vue实现表格中对数据进行转换、处理的方法
2018/09/06 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
5种Python单例模式的实现方式
2016/01/14 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
教师现实表现材料
2014/02/14 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
运动会加油稿100字
2014/09/19 职场文书
机关作风建设工作总结
2014/10/23 职场文书
社区服务活动报告
2015/02/05 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
月考总结与反思
2015/10/22 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang