Open Yhzhtk opened 8 years ago
我们知道 utf8mb4 是向后兼容 utf8 字符集的,也就是说 utf8mb4 完全包含 utf8。
那么使用 utf8mb4、utf8 字符集的不同表,在 join 时能否用上索引,left join 顺序改变是否能改变结果呢?
如果关联字段的类型和编码集一样,不同的长度能否使用上索引呢?
如果关联字段的编码集一样,不同的类型能否使用上索引呢?
下面通过学生表、班级表的例子来
// 班级表 CREATE TABLE `clazz` ( `id` int(11) NOT NULL, `class` varchar(10) DEFAULT NULL, `class_name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; // 学生表 CREATE TABLE `student` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `class` varchar(10) CHARACTER SET utf8 DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_class` (`class`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
explain select * from clazz left join student on student.class = clazz.class; 实验结果
explain select * from clazz left join student on student.class = clazz.class;
不同编码集能否使用索引
clazz.class | student.class | 能否使用索引 utf8 | utf8 | 能 utf8mb4 | utf8mb4 | 能 utf8 | utf8mb4 | 能 utf8mb4 | utf8 | 不能
不同长度能否使用索引
clazz.class | student.class | 能否使用索引 10 | 10 | 能 10 | 5 | 能 5 | 10 | 能
不同类型能否使用索引
clazz.class | student.class | 能否使用索引 char | varchar | 能 varchar | char | 能 varchar | int | 能 int | varchar | 不能
个人见解,如果有分析不正确的地方,欢迎指出交流!
问题
我们知道 utf8mb4 是向后兼容 utf8 字符集的,也就是说 utf8mb4 完全包含 utf8。
那么使用 utf8mb4、utf8 字符集的不同表,在 join 时能否用上索引,left join 顺序改变是否能改变结果呢?
如果关联字段的类型和编码集一样,不同的长度能否使用上索引呢?
如果关联字段的编码集一样,不同的类型能否使用上索引呢?
分析
下面通过学生表、班级表的例子来
DDL 如下:
SQL 查询语句:
不同编码集能否使用索引
不同长度能否使用索引
不同类型能否使用索引
结论
个人见解,如果有分析不正确的地方,欢迎指出交流!