在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创建高性能索引的全步骤
May 02 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
MySQL 常见存储引擎的优劣
Jun 02 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
mysql 索引合并的使用
Aug 30 MySQL
MySQL中几种插入和批量语句实例详解
Sep 14 MySQL
MySQL常见优化方案汇总
Jan 18 MySQL
MySQL的索引你了解吗
Mar 13 MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 MySQL
MySQL新手入门进阶语句汇总
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中Memcache操作类及用法实例
2014/12/12 PHP
php数组合并与拆分实例分析
2015/06/12 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
2016/05/20 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
EasyUI 数据表格datagrid列自适应内容宽度的实现
2019/07/18 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
vue v-for直接循环数字实例
2019/11/07 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
西班牙手机之家:Phone House
2018/10/18 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
兼职学生的自我评价
2013/11/24 职场文书
家居饰品店创业计划书
2014/01/31 职场文书
玲玲的画教学反思
2014/02/04 职场文书
物理课外活动总结
2014/08/27 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
撤诉状格式范本
2015/05/19 职场文书
钱学森电影观后感
2015/06/04 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang