我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解MySQL索引失效的几种情况

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解MySQL索引失效的几种情况

MySQL索引是提高查询效率的重要手段。索引失效会导致查询效率下降,甚至全表扫描,影响数据库性能。以下是可能导致MySQL索引失效的情况:

1. 使用or操作符

当where语句中使用or操作符并且or两边的条件涉及到至少两个字段时,MySQL无法使用索引,会转向全表扫描。因此,应尽量避免使用or操作符。

原因:因为MySQL中的索引是根据某个字段进行排序建立的。当使用or操作符,说明有两个条件其中某个条件成立即可,而我们使用某个索引时只能判断出对应字段的条件是否成立,即使不成立,另一个条件成立时该记录也符合我们要查询的结果。所以使用索引无法做出判断。

例:

-- id为主键索引EXPLAIN SELECT * FROM test WHERE id > 1 OR `name` = 'zs';

 

可以看出type为ALL:全表扫描

EXPLAIN SELECT * FROM test WHERE id > 3 OR id < 1;

 

可以看出type为PRIMARY:使用了主键索引;

2. 复合索引失效

如果使用了复合索引,但查询时未使用索引的第一列,索引也会失效。

原因:比如我们根据字段(t1,t2,t3)建立了复合索引,则排序规则是先按t1字段进行排序,t1字段相同再按t2字段排序,当t1、t2字段都相同时再按t3字段进行排序。如果我们的查询条件中没有使用到第一列,那么该索引也就没有办法使用。

例:

-- t1、t2列建立了符合索引EXPLAIN SELECT * FROM test WHERE t1 = '1' AND t2 = '2';

  

可以看出type为ref:使用了二级索引;(当使用二级索引列于常数进行等值比较时,访问方法为ref)

-- 未使用索引的第一列t1EXPLAIN SELECT * FROM test WHERE t2 = '1';

  

可以看出type为ALL:全表扫描

3. like查询

如果使用了like且以%开头,则索引会失效。

原因:模糊查询一般用在字符串的字段上,而字符串的排序规则为按字母字典序排序,如果以%开头,表示前面的字符取啥都行,则无法使用索引。

例:

EXPLAIN SELECT * FROM test WHERE t1 LIKE '1%';

 

可以看出type为range:使用二级索引进行范围查询。

EXPLAIN SELECT * FROM test WHERE t1 LIKE '%1';

 

可以看出type为ALL:全表扫描

4. 索引列上使用函数

原因:因为索引保存的是索引字段的原始值,而不是经过函数计算后的值,自然就没办法走索引了。

explain select * from test where length(t1) = 2;

  

5. 隐式类型转换

隐式类型转换规则:

  • 如果一个或两个参数都是NULL,比较的结果是NULL,除了安全的<=>相等比较运算符。对于NULL <=> NULL,结果为true。不需要转换。

  • 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。

  • 如果两个参数都是整数,则将它们作为整数进行比较。

  • 十六进制值如果不与数字进行比较,则被视为二进制字符串。

  • 如果其中一个参数是十进制值,则比较取决于另一个参数。 如果另一个参数是十进制或整数值,则将参数与十进制值进行比较,如果另一个参数是浮点值,则将参数作为浮点值进行比较(但没有将整数类型转换为浮点类型)。

  • 如果其中一个参数是TIMESTAMP或DATETIME列,另一个参数是常量,则在执行比较之前将常量转换为时间戳。

  • 在所有其他情况下,参数都是作为浮点数(双精度)比较的。

隐式类型转换会导致索引失效,比如当字段类型为字符串且建有索引,而查询条件类型为数值时,会将字符串类型隐式转换为浮点型,此时索引会失效。

原因:字符串类型转换为浮点数会使用cast函数,此时索引列上使用函数,导致索引失效。

EXPLAIN SELECT * FROM test WHERE t1 = 1.1;

  

6. 对索引进行表达式计算

原因:因为索引保存的是索引字段的原始值,而不是 id + 1 表达式计算后的值,所以无法走索引,只能通过把索引字段的取值取出来,然后进行表达式的计算来进行条件判断,因此采用的就是全表扫描的方式。

-- num字段有二级索引EXPLAIN SELECT * FROM test WHERE num = 1 + 10;

 

EXPLAIN SELECT * FROM test WHERE num + 1 = 10;

 

来源地址:https://blog.csdn.net/m0_57614677/article/details/129269023

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解MySQL索引失效的几种情况

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

下载Word文档

猜你喜欢

mysql索引失效的几种情况

常见情况:1、使用函数或运算;2、隐式类型转换;3、使用不等于(!=或);4、使用like操作符,并以通配符开头;5、or条件;6、null值;7、索引选择性低;8、复合索引的最左前缀原则;9、优化器决策;10、force index和ig
mysql索引失效的几种情况
2024-02-22

MySQL导致索引失效的几种情况

目录一、准备工作二、索引失效规则1.优先使用联合索引2.最左匹配原则3.范围条件右边的列索引失效4.计算、函数导致索引失效5.类型转换导致索引失效6.不等于(!= 或者)索引失效7.is null可以使用索引,is not null无法
2022-06-23

MySQL索引失效的几种情况小结

目android录1.最左前缀原则2. 计算、函数使索引失效3. 类型转换导致索引失效4. 不等于(或!=)导致索引失效5. is not null /is null可能不走索引,也可以走索引6. 模糊匹配Like以%开头7. OR前后
2023-03-20

MySQL索引失效的几种情况汇总

一.索引不存储null值 更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引,只能全表扫描。 为什么索引列不能存Nul
2022-05-17

oracle索引失效的情况有哪几种

有以下几种情况可能导致Oracle索引失效:1. 索引列上的数据分布不均匀:如果索引列上的数据分布不均匀,即某些值出现的频率非常高,而其他值出现的频率非常低,那么索引的效果可能会下降甚至失效。2. 索引列上的数据被频繁修改:如果索引列上的数
2023-10-08

MySQL索引优化之不适合构建索引及索引失效的几种情况详解

目录结论不建议建立索引的场景索引失效的场景小结结论具体案例下文有详尽描述不适合建立索引的场景:数据量比较小的表不建议建立索引有大量重复数据的字段上不建议建立索引(类似:性别字段)需要进行频繁更新的表不建议建立索引where、group
2022-07-29

Mysql索引失效的情况

前提:建立了一个employee表,同时建立了一个组合索引lastName,gender 。 1.最常说的like匹配                            例1 explain select * from employee where las
Mysql索引失效的情况
2016-01-15

SQL索引失效的11种情况详析

目录索引失效案例【1】. 全值匹配【2】. 最佳左前缀法则【3】. 主键插入顺序【4】. 计算、函数、类型转换(自动或手动)导致索引失效【5】. 类型转换导致索引失效【6】. 范围条件右边的列索引失效【7】. 不等于(!= 或者)索引失
2023-03-09

索引失效的情况

正常情况索引使用完全如下所示。 1、当所建索引是联合索引时,查询条件要按照联合索引的顺序进行,否则会出现索引失效的情况。 ①当联合索引的第一个字段不出现在条件中,而且where后面不包括所有索引列,俺么所有的索引都会失效。 ②当联合索引的第一个字段出现在条
索引失效的情况
2016-12-26

情况导致MySQL索引失效

MySQL索引失效的几种情况及代码示例引言:在MySQL数据库中,索引是提高查询性能的重要因素之一。然而,有时候我们会发现索引并没有起到预期的作用,查询性能并没有得到提升,甚至还会导致查询变得更慢。究其原因,很可能是索引失效了。本文将介绍
情况导致MySQL索引失效
2024-02-22

Mysql索引查询失效的情况

一:不在索引上使用函数,计算等 在kq_time上增加了一个索引,见图一 我们使用date()函数进行查询,见图二 图二根据kq_time字段查询并没有使用索引,我们可以根据kq_time换一种写法,他就可以走索引了,见图三 查询条件是一样的,图三的写法
Mysql索引查询失效的情况
2021-05-22

MySQL索引优化之适合构建索引的几种情况详解

目录结论建立索引的场景小结结论在where后面的过滤字段上建立索引(select/update/delete后面的where都是适用的),使用索引加快过滤效率,不用进行全表扫描在具有唯一要求的字段上添加唯一索引,加快查询效率,查到即可直接
2022-07-29

MySQL索引失效的情况有哪些

这篇文章主要讲解了“MySQL索引失效的情况有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL索引失效的情况有哪些”吧!1.最左前缀原则在MySQL数据库中,联合索引遵守最左前缀
2023-07-05

mysql引发索引失效的情况有哪些

这篇文章主要讲解了“mysql引发索引失效的情况有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql引发索引失效的情况有哪些”吧!1、在查询条件中计算索引列的使用函数或操作。若已建
2023-06-20

mysql索引什么情况下会失效

mysql索引在不使用索引列进行查询、数据类型不匹配、前缀索引的使用不当、使用函数或表达式进行查询、索引列的顺序不正确、数据更新频繁和索引过多或过少情况下会失效。1、不使用索引列进行查询,为了避免这种情况,应该在查询中使用适当的索引列;2、
2023-08-09

MySQL细数发生索引失效的情况

目录索引的存储结构不合理的模糊查询条件对索引使用函数对索引进行表达式计算对索引使用隐式转换联合索引非最左匹配where子句中的or总结索引的存储结构首先了解一下索引的存储结构,知道了索引的存储结构,才方便我们更好地理解索引失效的问题。索
2022-07-13

编程热搜

目录