今天同事碰到一个两表关联查询的问题,一个十万条,一个2万条数据。做关联查询,关联字段都有索引
查询一次居然要一分半的时间,怎么看都是正常的,同事疯了
我拿过来一看,数据没问题,没有空数据,索引建的也没有问题,当时也开始犯迷糊
查看explain 执行结果,发现未使用索引,有门
继续看是什么原因导致的未使用索引,
字段的索引建立没有问题(单字段索引)
字段类型都是varchar类型,字段类型没有问题
字段没有空值,也不影响索引使用
继续往下看查看完整的表结构,发现有意思的事情,
两张表的字符集不一致,分别是utf8和utf8mb4,
到这里问题就找到了,接下来我们做一个说明:
例如 表A 字符集是utf8mb4,表B字符集是utf8 然后A left join B 的时候会发生一个字符集隐式转换
因为utf8mb4 是向下兼容的,所以如果是B left join A 是没有问题的
那么接下来,解决办法:
如果非必要用utf8mb4,就把表A的关联字段字符集修改为utf8。 再次用做查询,速度正常。