首页 > 技术文章 > mysql 通过使用联全索引优化Group by查询

hubing 2015-10-20 10:20 原文

/*SELECT count(*) FROM (*/
EXPLAIN  SELECT st.id,st.Stu_name,tmpgt.time,tmpgt.goutong FROM jingjie_students st RIGHT JOIN (
SELECT * FROM _goutong gttime,(

SELECT name_id nameid, max(time) time FROM t_goutong GROUP BY name_id) gt

WHERE gttime.name_id=gt.nameid AND gttime.time=gt.time AND gttime.time>'2015-07-19 16:18:02') tmpgt ON st.id=tmpgt.name_id; /*) student_latested;*/

//未使用联合索引时'GROUP BY name_id'查询使用的是全表扫描,

//使用联合索引index name_id(name_id,time)后使用了索引:注意联合索引建立的先后顺序

 

熟悉Group by使用索引的情况:

 

一、GROUP BY 的索引应用
1、查询字段必须和后面GROUP BY 一致
select TeamID from competeinfo where TeamID >10 group by TeamID。
这里就是通过TeamID 来查找。完成group by 。
2、联合索引的应用,切记注意GROUP BY 顺序,Where 条件和GROUP BY 字段得是一个索引里面的
这个表CompeteID,TeamID建立联合索引
1)select TeamID from competeinfo where TeamID >10 and CompeteID > 100020 group by CompeteID
这个查询用到了CompeteID,TeamID联合索引
2)select TeamID from competeinfo where TeamID >10 and CompeteID > 100020 group by TeamID
这样的话查询group by中就没有用到索引了
二、下面是总结的是联合索引的使用
Index(Name,Age)表示在Name,Age两列上建立联合索引
如果where name='pp' 能使用索引
where age=25时不能使用索引
where name='pp' and age>25 能使用索引
where name ='pp' order by age 能使用索引
where name>'pp' order by age 不能使用索引
where name>'pp' order by name,age 能使用索引
order by name asc age desc 将不能使用索引!

推荐阅读