大家好,我是蓝胖子,前段时间mysql经常碰到慢查询报警,我们线上的慢sql阈值是1s,出现报警的表数据有多万,经常出现报警的是一个groupby的count查询,于是便开始着手优化这块,遂有此篇,记录下自己优化过程中的心得。
优化慢sql前,肯定是要懂sql的查询逻辑,所以我先介绍下groupby语句的执行逻辑。
groupby执行逻辑#环境准备#拿下面这张表举例,这是一张记录文件夹id和用户id关联关系的表。其中dir_id代表文件夹id,uid代表用户id,还有个唯一索引是uniq_dir_id。
createtablet_dir_user(idbigintunsignedauto_incrementprimarykey,dir_idbigintdefault0notnull,uidbigintdefault0notnull,constraintuniq_dir_idunique(dir_id,uid))
表一共有多万的数据。下面开始介绍使用groupby语句时sql执行的原理。
没有用到索引的情况#先说下结论,groupby后面的列如果不能使用上索引,那么则会产生临时表且很可能产生文件排序的情况。
groupby语句有分使用到索引和没有使用到索引的情况,先看看没有使用到索引的情况。假如我想查询在一些文件夹范围内,用户