问题现象和描述
修改数据列的字符编码集时要谨慎,在使用join时如果等号左右两边的列编码集不一致会导致索引无法命中。
例:
orders.whole_order_no=whole_order.whole_order_no
其中orders表中whole_order_no的字符集是utf8,whole_order表中的whole_order_no的字符集是utf8mb4。分析执行计划时会发现whole_order_no上的索引无法命中。
解决过程和办法
-
使用join时等号两边列的字符集保持一致
-
join时等号两边的字符集已经修改时,可以通过COLLATE关键字统一字符集,示例:
select
p.whole_order_no,
p.order_no,
f.package_no,
f.failure_data
from
invoice_failure f
left outer join order_package p on
p.package_no = f.package_no COLLATE utf8_general_ci
where
f.operate_status = 1
and f.type = 1;
评论区