一共三张表:
a_utf8
b_utf8mb4
a_utf8mb4
先执行以下语句:
explain
select * from b_utf8mb4 b8mb4 where not EXISTS (select psid from a_utf8mb4 a8mb4 where a8mb4.psid=b8mb4.id) and b8mb4.code like '52%';
show WARNINGS;
得到的结果:
按照官网上面的解释来理解的话是:
ref列显示的键列即b8mb4.id这一列与a8mb4.psid这一列上的索引index_psid进行比较,选取匹配的行。
从第二张图上面可以看出是直接匹配而不用做处理。
而执行下面这个语句:
explain
select * from a_utf8 a8 where not EXISTS (select psid from a_utf8mb4 a8mb4 where a8mb4.psid=a8.id) and a8.code like '52%';
show WARNINGS;
得到的结果:
可以看到ref列显示的是:func 表示的是用来比较的是某个函数的结果,再看看第二张图红色框是使用了 convert函数转换了字符编码。
所以总的来说是使用a8.id使用convert函数转化之后的的结果来和index_psid索引匹配,选取匹配的行。
因此当数据量比较大的时候,第二种情况的sql查询时间会非常长,因为id列每一行都要经过转码之后才与索引列比较,非常耗时。
所以做关联的时候同时也要注意关联的字段的字符集是否一致