阿里云数据库挑战赛SQL优化大师获奖案例

  2017/07在阿里云举办的第一届“阿里云数据库挑战赛第一季“慢SQL性能优化赛”期间,我得到知数堂叶老师的鼎力相助,成功突破重围,过关斩将,获得“SQL优化大师”荣誉称号!

  通过这次挑战赛的实践,加上中间叶老师的指导,让我增进了对SQL优化的认识。

  在此,分享下我的SQL优化过程,希望能给各位提供一些SQL优化方面的思路,大家共同交流进步。

  MySQL 5.6优化器增加了ICP、MRR、BKA等特性,5.7在性能上有更多提升。

  帅萌建议:上面这些基本优化建议可以听听叶老师的MySQL DBA优化课程,或者知数堂的公开课。

  首先,我们看到原来的执行计划中3个表的查询都是全表扫描(type = ALL),所以先把关联查询字段以及WHERE条件中的字段加上索引。

  我们注意到执行计划中3个表的key_len列都太大了,最小也有53字节,最大303字节,要不要这么夸张啊~

  默认字符集是utf8(每个字符最多占3个字节),因为该表并不存储中文,因此只需要用latin1字符集(最大占1个字节)。

  除此外,我们检查3个表的字段数据类型,发现有些varchar(100)的列实际最大长度并没这么大,有些实际存储datetime数据的却采用varchar(30)类型,有些用bigint/int就足够的也采用varchar类型,真是醉了。于是分别把这些数据类型改为更合适的类型。

  修改表字符集和调整各个列数据类型很重要的作用是可以减小索引的key_len,从而减少关联的字段的字节,减少内存消耗。

  以上是我在阿里云数据库挑战赛中的获奖案例,感谢在比赛过程中叶老师对我的提点和帮助,同时非常感谢知数堂教授SQL优化技能!

  最后,我想说的是,只要掌握SQL优化的几个常规套路,你也可以完成绝大多数的SQL优化工作滴!

  10月15日前(含10月15日当天),您将微信朋友圈集赞的截图,发送至助教:花花85597250(微信/QQ同号)即可参与活动,活动结果将在10月16-10月17日点对点反馈给参与者。

相关阅读