iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL 索引失效详解
  • 818
分享到

MySQL 索引失效详解

mysql数据库sql 2023-09-08 13:09:29 818人浏览 泡泡鱼
摘要

Mysql 索引失效详解 一、mysql索引失效原因汇总 隐式的类型转换,索引失效查询条件包含or,可能导致索引失效like通配符可能导致索引失效查询条件不满足联合索引的最左匹配原则在索引列上使用my

Mysql 索引失效详解

一、mysql索引失效原因汇总

  1. 隐式的类型转换,索引失效
  2. 查询条件包含or,可能导致索引失效
  3. like通配符可能导致索引失效
  4. 查询条件不满足联合索引的最左匹配原则
  5. 在索引列上使用mysql的内置函数
  6. 对索引进行列运算(如,+、-、*、/)
  7. 索引字段上使用 (! = 或者< >),索引可能失效
  8. 索引字段上使用is null, is not null,索引可能失效
  9. 左右连接,关联的字段编码格式不一样
  10. 优化器选错了索引

二、MySQL索引失效原因分析

(1)隐式的类型转换,索引失效

如:普通索引userId是string,查询时用了where userId = 123;结果不走索引;如果给数字加上’',也就是说,传的是一个字符串呢,当然是走索引。
解释:为什么第一条语句未加单引号就不走索引了呢?这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,
MySQL会做隐式的类型转换,把它们转换为浮点数再做比较。隐式的类型转换,索引会失效。

(2)查询条件包含or,可能导致索引失效

如:其中userId加了索引,但是age没有加索引的。我们使用了or,以下SQL是不走索引的,如下:select * from user where userId = ‘123’ or age = ‘18’;
解释:对于or+没有索引的age这种情况,假设它走了userId的索引,但是走到age查询条件时,它还得全表扫描,也就是需要三步过程:全表扫描+索引扫描+合并。
如果它一开始就走全表扫描,直接一遍扫描就完事。Mysql优化器出于效率与成本考虑,遇到or条件,让索引失效,看起来也合情合理嘛。
注意:如果or条件的列都加了索引,索引可能会走也可能不走,大家可以自己试一试哈。
但是平时大家使用的时候,还是要注意一下这个or,学会用explain分析。遇到不走索引的时候,考虑拆开两条SQL。

(3)like通配符可能导致索引失效

如:like查询以%开头,索引失效,如:select * from user where userId like ‘%123’;
like把%放后面,发现索引还是正常走的,如下:select * from user where userId like ‘123%’;
解释:并不是用了like通配符,索引一定会失效,而是like查询是以%开头,才会导致索引失效。
思考:既然like查询以%开头,会导致索引失效。我们如何优化呢?
1.使用覆盖索引;2.把%放后面

(4)查询条件不满足联合索引的最左匹配原则

MySQl建立联合索引时,会遵循最左前缀匹配的原则,即最左优先。在联合索引中,查询条件满足最左匹配原则时,索引才正常生效。
如果你建立一个(a,b,c)的联合索引,相当于建立了(a)、(a,b)、(a,b,c)三个索引。
前提:联合索引(userId,name)
如:select * from user where name =‘张三’;因为查询条件列name不是联合索引idx_userid_name中的第一个列,索引不生效;
select * from user where userId =‘123’;查询条件满足最左匹配原则时,索引才正常生效。

(5)在索引列上使用mysql的内置函数

如:给login_time加了索引,但是因为使用了mysql的内置函数Date_ADD(),索引直接失效,
select * from user where DATE_ADD(login_time,INTERVAL 1 DAY)=‘2022-05-22 00:00:00’;
思考:一般这种情况怎么优化呢?可以把内置函数的逻辑转移到右边,如下:
select * from user where login_time = DATE_ADD(‘2022-05-22 00:00:00’,INTERVAL 1 DAY);

(6)对索引进行列运算(如,+、-、*、/)

如:给age加了索引,但是因为它进行运算,索引直接失效,如:select * from user where age -1 = 10;
所以不可以对索引列进行运算,可以在代码处理好,再传参进去。

(7)索引字段上使用 (! = 或者< >),索引可能失效

如:给age加了索引,但是使用了!= 或者< >,not in这些时,索引如同虚设。如下:select * from user where age != 18;
解释:其实这个也是跟mySQL优化器有关,如果优化器觉得即使走了索引,还是需要扫描很多很多行的话,它觉得不划算,不如直接不走索引。
平时我们用!= 或者< >,not in的时候,留点心眼哈。

(8)索引字段上使用is null, is not null,索引可能失效

如:给单个name字段加上索引,并查询name为非空的语句,其实会走索引的,如下:select * from user where name is not null;
单个card字段加上索引,并查询card为非空的语句,其实会走索引的,如下:select * from user where card is not null;
注意:但是它两用or连接起来,索引就失效了,如下:select * from user where name is not null or card is not null;
解释:很多时候,也是因为数据量问题,导致了MySQL优化器放弃走索引。同时,平时我们用explain分析SQL的时候,如果type=range,要注意一下哈,
因为这个可能因为数据量问题,导致索引无效。

(9)左右连接,关联的字段编码格式不一样

前提:user表的name字段编码是utf8mb4,而user_job表的name字段编码为utf8。
如:执行左外连接查询,user_job表还是走全表扫描,如下:select * from user a join user_job b on a.name = b.name;
如果把它们的name字段改为编码一致,相同的SQL,还是会走索引。

(10)优化器选错了索引

解释:MySQL 中一张表是可以支持多个索引的。你写SQL语句的时候,没有主动指定使用哪个索引的话,用哪个索引是由MySQL来确定的。
思考:我们日常开发中,不断地删除历史数据和新增数据的场景,有可能会导致MySQL选错索引。那么有哪些解决方案呢?
1.使用force index 强行选择某个索引
2.修改你的SQl,引导它使用我们期望的索引
3.优化你的业务逻辑
4.优化你的索引,新建一个更合适的索引,或者删除误用的索引。

关注林哥,持续更新哦!!!★,°:.☆( ̄▽ ̄)/$:.°★ 。

来源地址:https://blog.csdn.net/qq_45912025/article/details/130404195

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 索引失效详解

本文链接: https://www.lsjlt.com/news/399966.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL 索引失效详解
    MySQL 索引失效详解 一、MySQL索引失效原因汇总 隐式的类型转换,索引失效查询条件包含or,可能导致索引失效like通配符可能导致索引失效查询条件不满足联合索引的最左匹配原则在索引列上使用my...
    99+
    2023-09-08
    mysql 数据库 sql
  • mysql索引失效
    一、索引失效 当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效 使用order by对数据库进行查询时,导致索引失效 ,order by走全表扫描比回表的时间更少 主键和唯一索引在同一列时,会导致索引...
    99+
    2023-09-06
    mysql 数据库
  • 详解MySQL索引失效的几种情况
    MySQL索引是提高查询效率的重要手段。索引失效会导致查询效率下降,甚至全表扫描,影响数据库性能。以下是可能导致MySQL索引失效的情况: 1. 使用or操作符 当where语句中使用or操作符并且or两边的条件涉及到至少两个字段...
    99+
    2023-09-03
    数据库 mysql java
  • mysql索引失效如何解决
    当MySQL索引失效时,可以尝试以下方法来解决:1. 重新分析表:使用ANALYZE TABLE语句来重新分析表的统计信息,使MyS...
    99+
    2024-02-29
    mysql
  • MySQL索引失效原理
    目录1、索引失效原因2、再来看看哪些情况会破坏索引的有序性。 - 对索引字段做函数操作 - 隐式类型转换 - 隐式字符编码转换 3、总结 1、索引失效原因 首先看看哪些情况下,将会导...
    99+
    2024-04-02
  • MySQL数据库索引以及失效场景详解
    目录1. MySQL索引概述1.1 索引的概念1.2 索引的特点1.3 索引的分类1.4 索引的使用场景2. 索引失效场景2.1 索引失效9种场景2.2 索引失效场景总结3. 索引失...
    99+
    2024-04-02
  • Mysql索引失效的解决方法
    小编给大家分享一下Mysql索引失效的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景6千万数据量的数据表出现了一个满...
    99+
    2024-04-02
  • mysql索引失效的原因
    小编给大家分享一下mysql索引失效的原因,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!索引对于MySQL而言,是非常重要的篇章。索引知识点也巨多,要想掌握透彻,需要逐个知识点一一击破,今天来...
    99+
    2024-04-02
  • mysql查询索引失效怎么解决
    当MySQL查询索引失效时,可以尝试以下几种方法来解决: 重新分析表:使用ANALYZE TABLE table_name命令可以...
    99+
    2024-04-09
    mysql
  • mysql联合索引失效怎么解决
    当MySQL联合索引失效时,可以考虑以下几个解决办法:1. 重新设计索引:检查当前的联合索引是否满足查询需求,如果不满足,可以重新设...
    99+
    2023-10-25
    mysql
  • mysql组合索引失效怎么解决
    当MySQL组合索引失效时,可以尝试以下几种解决方法:1. 重新设计索引:检查当前索引是否合适,可能需要重新设计索引来更好地支持查询...
    99+
    2023-10-25
    mysql
  • MySQL索引失效问题怎么解决
    MySQL索引失效问题可能是由于索引选择不当、数据分布不均匀、查询条件不符合索引规则等原因造成的。解决这些问题可以尝试以下方法: ...
    99+
    2024-04-09
    mysql
  • mysql字段为NULL索引是否会失效实例详解
    项目场景: 很多博客说mysql在字段中创建普通索引,如果该索引中的数据存在null值是不走索引这个结论是错误的,不过尽量还是设置默认值。(版本8.0低于这个版本可能结果不一致) 1...
    99+
    2024-04-02
  • mysql索引失效的常见九种原因图文详解
    目录前言:1.最佳左前缀法则3.计算、函数、类型转换(自动或手动)导致索引失效4.范围条件右边的列索引失效5.不等于(!= 或者<>)导致索引失效6.is null可以使...
    99+
    2024-04-02
  • MySQL索引失效原因以及SQL查询语句不走索引原因详解
    目录前言1. 隐式的类型转换,索引失效2. 查询条件包含 or,可能导致索引失效3. like 通配符可能导致索引失效4. 查询条件不满足联合索引的最左匹配原则5. 在索引列login_time上使用 mysql 的内置...
    99+
    2023-03-06
    mysql索引在什么时候失效 mysql 索引失效 mysql索引失效怎么办
  • mysql回表致索引失效案例讲解
    简介 mysql的innodb引擎查询记录时在无法使用索引覆盖的场景下,需要做回表操作获取记录的所需字段。 mysql执行sql前会执行sql优化、索引选择等操作,mysql会预估各...
    99+
    2024-04-02
  • mysql索引为什么会失效
    这篇文章主要介绍了mysql索引为什么会失效,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。mysql索引失效的几种情况:1、条件中有or,即使其...
    99+
    2024-04-02
  • mysql如何判断索引失效
    在mysql中判断索引是否失效的方法:1.命令行启动mysql服务;2.登录mysql;3.选择数据库;4.执行“explain select surname,first_name form a,b where a.id...
    99+
    2024-04-02
  • 情况导致MySQL索引失效
    MySQL索引失效的几种情况及代码示例 引言:在MySQL数据库中,索引是提高查询性能的重要因素之一。然而,有时候我们会发现索引并没有起到预期的作用,查询性能并没有得到提升,甚至还会导...
    99+
    2024-02-22
    索引选择不当 sql语句 mysql索引
  • mysql数据库索引失效怎么解决
    当MySQL数据库索引失效时,可以尝试以下几种方法来解决问题: 重新设计索引:检查数据库表的索引设计是否合理,是否覆盖了常用的查...
    99+
    2024-04-09
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作