背景:
Sql查询速度缓慢,造成接口调用超过1s,接下来要针对问题出现的原因对sql语句进行优化
执行下面查询语句:
EXPLAIN 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
course_id字段、is_delete字段和class_id字段没加索引时
添加索引之后
select_type 表示对应行是简单还是复杂的查询,primary表示复杂查询中最外层的 select,derived表示包含在 from 子句中的子查询
table表示访问到的表,<derived2>表示有子查询并且id为1的查询以来id为2的子查询,id2子查询先于id1执行。
type列为all表示全表扫描,没有使用索引,效率由高到低分别为system > const > eq_ref > ref > range > index > ALL,查询至少达到range级别。
possible_keys显示查询可能使用哪些索引来查找
key表示mysql实际采用哪个索引来优化对该表的访问。
添加索引的效果是扫描的行数明显减少。
distinct和group by的区别:
实践表明,没有用到索引的情况下,distinct效率高于group by。因为distinct 和 group by都会进行分组操作,但group by可能会进行排序。