t1 插入一些数据 t2插入一些数据 可以明显地看到,t2.name =’dddd’使用了索引,而t1.code = t2.code这个关联条件没有使用到t1.code上面的索引,一开 始也百思不得其解,但是机器不会骗人。显示警告查看 发现问题:在发现了转换(使用utf8mb4的testdb.t1.code)之后,Scott发现2个表的字符集不一样。t1为utf8,t2为utf8mb4。但是为什么表表字符集不一样(实际是我修改了字符集 字符串字符集不一样了)就会导致T1全表扫描呢?下面来做分析。 解决问题: 现在再来查看执行计划,可以看到已经没问题了。
mysql修改字符集utf8mb4引发的惨案
CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `code` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_code` (`code`), KEY `idx_name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
CREATE TABLE `t2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `code` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_code` (`code`), KEY `idx_name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4
2张表left join的执行计划如下:desc select * from t2 join t1 on t1.code = t2.code where t2.name = 'dddd'G;
查询执行计划的告警信息:
show warnings;
(1)首先t2左联接t1决定了t2是驱动表,此步相当于执行了选择* from t2 where t2.name =‘dddd’,取码范围的值,这里为’8a77a32a7e0825f7c8634226105c42e5’;
(2)然后拿起t2查到的代码的值根据联接条件去t1里面查找,这一步就相当于执行了select * from t1 where t1.code =‘8a77a32a7e0825f7c8634226105c42e5’;
(3)但是由于第(1)步里面T2表取出的代码字段是utf8mb4字符集,而T1表里面的代码是UTF8字符集,这里需要做字符集转换,字符集转换遵循由小到大的原则,因为utf8mb4是UTF8的超集,所以这里把UTF8转换成utf8mb4,即把t1.code转换成utf8mb4字符集,转换了之后,由于t1.code上面的索引仍然是UTF8字符集,所以这个索引就被执行计划忽略了,然后T1表只能选择全表扫描。更糟糕的是,如果T2筛选出来的记录不止1条,那么T1就会被全表扫描多次,性能之差可想而知。
既然原因已经清楚了,如何解决呢?当然是改字符集了,把T1改成和T2一样或者把T2改成T1都可以,这里选择把T1转成utf8mb4。那怎么转字符集呢?
有一个同学会说用alter table t1 charset utf8mb4;而是错的,这只是改了表的替代字符集,即新的数据才会使用utf8mb4,已经存在的一部分仍然是utf8。
用只有alter table t1 convert to charset utf8mb4;才是正确的。
但是还要注意一点,更改表改字符集的操作是双重写的(用lock = node会报错)所以业务高峰时请不要操作,即使在业务低峰时期,大表的操作仍建议使用pt-online -schema改变在线修改字符集。
测试环境:使用 alter table t1 convert to charset utf8mb4, lock=shared;
1、 表字符集不同时,可能导致加入的SQL使用不到索引,引起严重的性能问题;
2、 改字符集的alter table操作会多个写,业务mysql建议使用pt-online-schema-change;
3、 如果要大批量修改表的字符集,同样做好SQL的审议工作,关联的表的字符集一起做修改。
4、 效仿一下使用show warnings【千万不能忘】
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算