MySQL索引失效原理

作者:bkpp976 时间:2024-01-19 01:00:50 

目录
  • 1、索引失效原因

  • 2、再来看看哪些情况会破坏索引的有序性。

    • - 对索引字段做函数操作

    • - 隐式类型转换

    • - 隐式字符编码转换

  • 3、总结

    1、索引失效原因

    首先看看哪些情况下,将会导致查找不能利用索引的有序性。

    假设一个表test中有a,b,c,d四个字段,c是主键。

    在a,b字段上建立联合索引(a,b):CREATE index idx_a_b on test(a,b); B+树联合索引.JPG

    MySQL索引失效原理

    可以得到的规律是:优先按a字段从小到大排序,a字段相等的按b字段从小到大排序;

    分析以下情况,索引是否会失效以及失效的原因:

    条件只包含b字段


    select * from test where  b=2;

    索引失效:

    MySQL索引失效原理

    显然,走的时候全文扫描,并没有使用索引。因为只看b字段的索引,是2,4,1,3,4,5,并不能利用索引的有序性快速定位。

    对a字段范围查询:


    select * from test where  a>1 and b=2;

    索引失效:

    MySQL索引失效原理

    可以看到,索引并没有完全失效,而是先利用索引定位到a的位置。因为这里的key_len是4,而联合索引的key_len是8。

    对a字段等值查询,b字段范围查询:

    索引失效:

    MySQL索引失效原理

    可以看到是using index并且key_len是8,也就是两个字段的索引都用到了,这也对应着联合索引排列的规律:a字段相同的情况下,b字段有序排列。

    以上几种情况可以总结为:不符合最左前缀匹配原则导致索引失效。

    最左匹配前缀保证可以利用到索引排序的有序性,而把等值查询放在前面,范围查询放在后面,是利用了[前缀字段相等的情况下,后面的索引字段有序]这个特性,是特殊意义下的最左前缀匹配原则。

    2、再来看看哪些情况会破坏索引的有序性。

    - 对索引字段做函数操作

    对索引字段做函数操作,比如y=f(x),并不能保证得到的y的值依然是有序的,在这种弄个情况下,优化器会放弃树的搜索功能,但是不排除优化器在发现该索引树比主键索引小很多的情况下,选择扫描这个索引。

    - 隐式类型转换

    在 MySQL 中,字符串和数字做比较的话,是将字符串转换成数字。隐式类型转换的本质是对索引字段使用了CAST()函数,原理同上。

    - 隐式字符编码转换

    字符串编码转换的本质是使用了CONVERT() 函数。

    3、总结

    索引失效的原因是优化器发现不能利用索引的有序性,因此在使用索引时,要尽量满足最左前缀匹配原则、范围查询放在最后、不使用%like %like%等模糊查询,就是在最大程度利用索引的有序性;但是在某些情况下,优化器只是放弃索引树的搜索功能,可能还是会选择扫描这个索引。

    来源:https://juejin.cn/post/7038582872650809381

    标签:MySQL,索引,失效
    0
    投稿

    猜你喜欢

  • 如何添加一个mysql用户并给予权限详解

    2024-01-17 06:09:36
  • javascript 实现子父窗体互相传值的简单实例

    2023-08-09 09:52:52
  • Python语言实现将图片转化为html页面

    2023-09-24 01:21:02
  • Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    2023-06-15 22:47:05
  • Win10下配置VScode远程开发ssh-remote(免密登录)

    2022-07-17 23:01:13
  • python使用pyecharts库画地图数据可视化的实现

    2023-04-18 09:44:25
  • SQL Server三种锁定模式的知识讲解

    2024-01-17 19:30:11
  • 返回页面顶部top按钮通过锚点实现(自写)

    2024-04-10 10:47:23
  • python pillow库的基础使用教程

    2023-05-21 19:19:29
  • matplotlib subplots 设置总图的标题方法

    2022-10-09 13:49:42
  • python 数字类型和字符串类型的相互转换实例

    2021-08-02 08:11:36
  • MySql数据引擎简介与选择方法

    2024-01-28 12:04:29
  • python miniWeb框架搭建过程详解

    2023-10-04 15:04:25
  • tensorflow训练中出现nan问题的解决

    2023-02-10 09:34:09
  • 背景图片千万不要gzip压缩,尤其是PNG

    2009-06-19 12:42:00
  • HTML在线编辑器的原理分析(整理)

    2007-12-22 10:25:00
  • Python 字符串的有关知识详解

    2022-03-14 16:54:12
  • Python如何通过变量ID得到变量的值

    2023-01-22 22:35:56
  • asp dictionary对象的用法

    2011-04-14 11:09:00
  • 页面中横排布局的思考

    2008-01-18 12:56:00
  • asp之家 网络编程 m.aspxhome.com