当前位置: 移动技术网 > IT编程>数据库>Mysql > MySQL中哪些情况会用不上索引

MySQL中哪些情况会用不上索引

2020年07月18日  | 移动技术网IT编程  | 我要评论

1、对where条件字段做了函数操作

对索引字段做函数操作,可能会破坏索引值的有序性,比如where month(t_modified)=7表示选取月份为7月的记录,此时无法使用索引的快速定位功能,改为全索引扫描。因此,为了用上索引的快速定位能力,我们要尽量避免对条件字段的函数操作,改成基于字段本身的范围查询,改成where t_modified>=‘2020-7-1’ and t_modified<‘2020-8-1’。我们要保证where后面等号的左边不做任何操作,比如where id+1=100,对于这种不会破坏索引有序性的操作,MySQL依然不会使用索引。

2、隐式类型转换

如果类型转换发生在where后面"="的左侧,此时类似于对条件字段做了函数操作,MySQL依然不会使用索引。比如表 t 中的 a 字段是varchar(32)类型,做where a=101212操作时,会将字符串转换成数字。

3、隐式字符编码转换

如果where后面"="左右两边的比较的时候,使用的字符集不同,比如表T1的字段a使用utf8(字段a建立了索引),表T2的字段b使用utf8mb4,执行where T1.a=T2.b的操作且T2为驱动表,将会对a做隐式字符编码转换,转换为utf8mb4,因为utf8mb4是utf8的超集,在做自动类型转换时,为了避免数据被截断导致精度丢失,一般都会将数据长度短的类型转换为数据长度长的类型。因此,a做类型转换将导致无法使用索引的定位功能。

解决办法:①将a字段的字符集改为utf8mb4;②如果数据量比较大,或者业务上暂时不能做①中这个DDL的话,只能在SQL语句中对b做强制类型转换,比如where T1.a = CONVERT(T2.b USING utf8)。

本文地址:https://blog.csdn.net/Longstar_L/article/details/107397246

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网