一:背景介绍
1、问题一:查询11s导致接口请求超时
2、问题二:由于设计数据稍微大了点,接口调用就超过了1s
二:思路&方案
1、Mysql语句的执行顺序
- from
- on
- join
- where
- group by
- having + 聚合函数
- select
- distinct
- order by
- limit
上面sql语句执行的顺序为2–>3–>4–>1–>5–>6
2、explain关键字解析
explain是解释、说明的意思。在mysql里,一条查询语句需要经过Mysql查询优化器的各种成本和规则,生成一个执行计划。儿explain关键字就是查询这个执行计划的,通过explain关键字,可以分析我们的查询语句的效率。
语法:explain select * from table
3、distinct和group by效率对比
- 有索引的情况下,group by和distinct都能用索引,效率相同
- 没有索引的时候,distinct效率高于group by,distinct是根据信息不同进行直接进行去重,group by的原理是结果先进行分组排序,然后返回每组中的第一条数据
- 如果是单纯的去重操作的话,无论是否有索引,distinct的效率都更加高,但是吐过查询的列和去重的列不对应的话,distinct就无法使用了。相较于group by不够灵活
- group by的语义更加的明确,并且group by可以根据分组的情况加上聚合函数,做一些其他的处理,功能更加丰富,但是有时间效率将低于distinct
- distinct用法
select distinct 列1 , 列2 from table
- group by用法
select 列1,列2 from table group by 列1 ,列2
4、优化案例
1)数据类型不一致
sql语句
SELECT aui.ding_phone, aui.ding_name, aui.chaoxing_name, aui.chaoxing_phone FROM (SELECT info_id FROM arpro_user_course_info WHERE course_id = 223667994 AND class_id = 55801765 AND is_delete = 0 GROUP BY info_id ) auci LEFT JOIN arpro_user_info aui ON auci.info_id = aui.id
表字段数据类型
创建索引
执行结果:主键索引没有生效
2)数据类型一致
sql语句
SELECT aui.ding_phone, aui.ding_name, aui.chaoxing_name, aui.chaoxing_phone FROM ( SELECT DISTINCT info_id FROM arpro_user_course_info WHERE course_id = 223667994 AND class_id = 55801765 AND is_delete = 0 ) auci LEFT JOIN arpro_user_info aui ON auci.info_id = aui.id
执行结果