DevsDawn
DevsDawn

解决MySQL in select子查询无法使用索引问题

近期在编写一个业务逻辑,需要从订单表中找出所有手机号属于某一个用户的订单,而每个用户可关联多个手机号,于是有以下的查询语句:

select * from mall_order where phone in (select phone from user_phone where user_id = #{id]})

以上mall_order表的phone字段和user_phoneuser_id字段均已添加索引。
然而,通过对以上语句explain后发现索引失效,语句对mail_order进行了全表查询,并没有使用到已经添加的phone索引。

经过排查,发现mall_order表和user_phone表的phone字段均为varchar类型,然而两个字段设置的编码并不相同,一张表使用的是gbk_chinese_ci类型,而另一张表使用的是utf8_general_ci类型,导致索引无法使用。

将两个字段修改为相同编码后,重新尝试执行explain发现可以正常使用索引了。

若无特别说明,本文采用 CC BY-SA 4.0 协议进行许可。如需转载,请附上本文链接和本声明。
本文链接:https://devsdawn.com/2022/12/solving-mysql-in-select-subquery-cannot-use-index/
DigitalOcean云服务,美国上市公司,注册即送200USD体验金
Vultr云服务,全球25+地域,注册即送100USD体验金

发表回复

textsms
account_circle
email

DevsDawn

解决MySQL in select子查询无法使用索引问题
近期在编写一个业务逻辑,需要从订单表中找出所有手机号属于某一个用户的订单,而每个用户可关联多个手机号,于是有以下的查询语句: select * from mall_order where phone in (select …
扫描二维码继续阅读
2022-12-07