近期在编写一个业务逻辑,需要从订单表中找出所有手机号属于某一个用户的订单,而每个用户可关联多个手机号,于是有以下的查询语句:
select * from mall_order where phone in (select phone from user_phone where user_id = #{id]})
以上mall_order
表的phone
字段和user_phone
的user_id
字段均已添加索引。
然而,通过对以上语句explain后发现索引失效,语句对mail_order
进行了全表查询,并没有使用到已经添加的phone
索引。
经过排查,发现mall_order
表和user_phone
表的phone
字段均为varchar
类型,然而两个字段设置的编码并不相同,一张表使用的是gbk_chinese_ci
类型,而另一张表使用的是utf8_general_ci
类型,导致索引无法使用。
将两个字段修改为相同编码后,重新尝试执行explain发现可以正常使用索引了。
发表回复