索引失效之字符集不同
在面试过程中,面试官问你索引失效有几种情况,当你被问到字符集不同时,索引会不会失效。无论此时你回答会或者不会,这都不是一个很好的回答。
一般来说,当字符编码不同时,索引可能会失效,这个可能就很耐人寻味,本章将介绍此种索引失效的可能性。
1. 例子
表a的字段:
索引:
表 b的字符编码:
索引:
当a表为驱动表的时候
此时可以看出索引失效
当b表为驱动表时
此时索引并未失效。
2. 解释原因
2.1 字符集编码关系:
utf8mb4 是 utf8 的超集,当进行比较的时候,子集会通过隐式转换变成超集。因此隐式转换的位置是决定是否走索引的关键。
可以看到当a为驱动表时,隐式转换发生在被驱动表上,b索引性质改变,索引失效
SELECT * FROM automl_dataset a LEFT JOIN automl_base_dataset b ON a.dataset_name = (隐式转换)b.dataset_name
当b为驱动表时候,虽然隐式转换还发生在b上,但此时a的索引性质并未发生改变,此时索引不失效。
SELECT * FROM automl_dataset a RIGHT JOIN automl_base_dataset b ON a.dataset_name = (隐式转换)b.dataset_name

浙公网安备 33010602011771号