索引失效之字符集不同

在面试过程中,面试官问你索引失效有几种情况,当你被问到字符集不同时,索引会不会失效。无论此时你回答会或者不会,这都不是一个很好的回答。

一般来说,当字符编码不同时,索引可能会失效,这个可能就很耐人寻味,本章将介绍此种索引失效的可能性。

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

 

posted @ 2022-06-08 17:29  小罗咯  阅读(83)  评论(0)    收藏  举报