MySQL中哪些情况会用不上索引
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
上一篇: 隐身446万企业幕后的行业之王
下一篇: Linux传输超大文件方法介绍