千家信息网

mysql哪些查询情况不走索引

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要介绍"mysql哪些查询情况不走索引"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"mysql哪些查询情况不走索引"文章能帮助大家解决问题。mysq
千家信息网最后更新 2025年01月20日mysql哪些查询情况不走索引

这篇文章主要介绍"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数据类型为varcharSELECT * 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 '0' 不走索引

更改方法:

%linux%类的搜索需求,可以使用elasticsearch+mongodb 专门做搜索服务的数据库产品

关于"mysql哪些查询情况不走索引"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

索引 查询 数据 情况 方法 条件 业务 语句 测试 运算 函数 知识 类型 结果 频繁 内容 字段 字符 建议 数据库 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全保护制度怎么分级 举办网络安全宣传周校园日活动 青少年网络安全课合集 从数据库表中查询数据 sql数据库建表心得体会 青岛大学网络安全学院 网络安全教育个人信息有哪些 sql数据库试图的创建 将wifi改成服务器 电脑的kms服务器在哪启动 十大杰出青年网络安全 计算机网络技术宣传 浦东新区信息软件开发厂家价格 linux数据库图形化管理 怎么看战地1在哪个服务器 大疆无人机应用软件开发商 为什么华为平板无法连接服务器 韩国网站服务器 abap使用什么数据库 网络慢会不会让数据库死锁 网络安全证书需要考什么 远程管理svn服务器 天津调度服务器安装云空间物理机 网络安全一年检查几次 中国服务器在那里 linux 下 网络安全 梦幻如何清除没有角色的服务器 嘉兴网络技术咨询有哪些 中国拥有数据库的互联网公司 郴州软件开发培训多少钱
0