天天看点

mysql 通过使用联全索引优化Group by查询

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 将不能使用索引!

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 将不能使用索引!