案例12-数据类型不一致导致索引失效

简介: 数据类型不一致导致索引失效

一:背景介绍

       在开发的过程中在编写查询语句的时候经常会用到is_delete=0的语句条件,但是我们在设计表的时候会把is_delete字段的类型设置为varchar。这就导致我们在执行有is_delete=0的sql语句的时候索引会失效。因为sql有一个优化器他会把数值类型的0转换成字符类型的0。数据类型转换会导致索引的失效。

a55c9d837da54c52893451a97c49a7a0.png

二:思路&方案

       1.mysql三大数据类型,分为数值类型、时间日期类型和字符类型。

       2.验证数据类型转换的sql语句查看索引是否生效

       3.验证数据类型没有转换的sql语句查看索引是否生效

三:验证过程

验证数据类型转换的sql语句查看索引是否生效

1.表中的索引b0f4149b8da54ad6892246d3196f12b6.png

2.表中字段的数据类型

993b49882bd0413c9c1522d1985a02cc.png

3.执行sql语句

bcd6007f4d3d40528514622b5a180d82.png

       type中的ALL代表全表查询,用结果上来看我们添加的索引是没有生效的。因为我们在执行sql语句的时候is_delete赋的值是数值类型,但是数据库中是字符类型。所以进行了类型的转换。导致索引是没有生效的。

验证数据类型没有转换的sql语句查看索引是否生效

1.将sql语句中的值改为字符类型

251f0a2ba6054d2a929e9267fab80e3a.png

       type中从ALL转换成了ref。索引生效了

四:索引失效

1.在索引类上做操作,比如类型转换,函数

fb054dee101c425a951d3b32fe36e8a1.png

2.通配符开头

05cad95ab5144531ad57922e419171c4.png

3.WHERE 子句中的 OR

如果where 子句里 or前的列是索引列,or后面的条件列不是索引列,索引就会失效。

27e2fe26b0b44cd8b08dffd46983284c.png

4.组合索引,不符合最左匹配原则

假设我们对字段 a,b 建立了一个组合索引(a,b)。

如果我们的查询是以下几种,则会正常走联合索引:

where a = 1;
where a = 2 and b = 2;

如果是如下几种则不会走组合索引:

where b = 2;
where b = 2 and a = 3;

通过对比我们可以看出,索引的生效是遵循最左匹配原则的。在使用的时候,必须从最左侧的索引开始。

五:总结

  1. 理解索引失效的原因:索引失效可能由于多种原因导致,如查询条件不符合索引列的顺序、使用了不匹配的数据类型、使用了函数或表达式等。理解索引失效的原因是优化索引的第一步,可以通过数据库的查询执行计划或者索引统计信息来定位问题。
  2. 优化查询条件和索引顺序:根据索引失效的原因,可以优化查询条件和索引的顺序。例如,将查询条件中最具选择性的条件放在前面,以便数据库优化器能够更好地使用索引。另外,避免在索引列上使用函数或表达式,以免导致索引失效。
  3. 创建合适的索引:根据查询的特点和频率,创建合适的索引可以提高查询性能。通过分析查询语句和数据访问模式,可以确定需要创建的索引类型和列。同时,避免创建过多的索引,以免增加维护成本和降低更新性能。
  4. 更新索引统计信息:索引统计信息对于数据库优化器的查询计划选择非常重要。定期更新索引统计信息可以帮助数据库优化器更准确地评估索引的选择性和成本,从而选择更合适的查询计划。
  5. 避免过度索引:过度索引是指创建了过多的重复或不必要的索引。过度索引不仅增加了存储和维护成本,还可能导致索引失效和查询性能下降。因此,需要审查和删除不必要的索引,保持索引的简洁和高效。

六:升华

       只有明确了什么情况下索引会失效,再添加索引和使用索引的时候才会生效。才不会导致我们添加了索引占用了资源还没有生效的情况。明确概念明确边界。  


相关文章
|
1月前
|
SQL Oracle 关系型数据库
分析索引失效的几种情况
联合索引 is not null 只要在建立的索引列(不分先后)都会走, in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),或者=一个值; 当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。
28 1
|
1月前
|
SQL Oracle 关系型数据库
索引失效的情况分析
大家都知道,一条查询语句走了索引和没走索引的查询效率是非常大的,在我们建好了表,建好了索引后,但是一些不好的sql会导致我们的索引失效,下面介绍一下索引失效的几种情况
15 0
|
17天前
|
存储 关系型数据库 索引
10. 在一个非主键字段上创建了索引, 想要根据该字段查询到数据, 需要查询几次 ?
在非主键字段上创建索引,查询数据通常需两次。对于MyISAM,先通过索引找到数据行指针,再获取数据;而InnoDB则先找主键ID,再从主键索引中查找数据。
11 0
|
9月前
|
存储 SQL 关系型数据库
项目实战典型案例12——mysql数据库 数据类型与表字段类型不一致导致索引失效
项目实战典型案例12——mysql数据库 数据类型与表字段类型不一致导致索引失效
132 0
|
数据库 索引
MysSQL索引会失效的几种情况分析
MysSQL索引会失效的几种情况分析
122 0
MysSQL索引会失效的几种情况分析
|
NoSQL 关系型数据库 MySQL
【已解决】MongoDB 中根据指定字段筛选出具有重复值的记录
【已解决】MongoDB 中根据指定字段筛选出具有重复值的记录
661 0
【已解决】MongoDB 中根据指定字段筛选出具有重复值的记录
|
存储 SQL 搜索推荐
索引失效案例
索引失效案例
索引失效案例
|
存储 SQL 关系型数据库
MySql索引详解-各种索引的定义与区别和应用
什么是索引?索引的作用,有无索引的区别。
152 0
MySql索引详解-各种索引的定义与区别和应用
测试关于索引的操作- 修改索引
测试关于索引的操作- 修改索引
|
存储 关系型数据库 MySQL
MySql优化:MySql查询字段最大长度
MySql优化:MySql查询字段最大长度
204 0