优化 group by 查询一优化后
Explain SELECT actor.first_name, actor.kast_name, c.cnt FROM sakila.actor INNER JOIN ( SELECT actor_id, COUNT (*) AS cnt FROM sakila.film_actor GROUP BY actor_id ) AS c USING(actor_id);
在子查询内加过滤条件
explain SELECT actor.First_name, actor.Last_ name, COUNT (*) FROM sakila.film_actor INNER JOIN sakila.actor USING(actor_id) GROUP BY film_actor.actor_id;
优化前(1:02);并未时候用where语句,因此后台会出现页表扫描的情况,降低sql执行效率。后台仍然使用了临时表和文件排序的操作。
优化后:利用关联子查询,查到了每一个演员id对应影片数量,再跟演员表关联,查询到了演员姓名,以及对应的影片数量。(当然二者from的表都不一样,优化前是from film_actor,优化后是from actor,可能二者不同表之间数据量也存在差异)
优化前(1:02);并未时候用where语句,因此后台会出现页表扫描的情况,降低sql执行效率。后台仍然使用了临时表和文件排序的操作。
优化后:利用关联子查询,查到了每一个演员id对应影片数量,再跟演员表关联,查询到了演员姓名。
using()用于两张表的join查询,要求using()指定的列在两个表中均存在,并使用之用于join的条件;例如: select a.*, b.* from a left join b using(colA);
group by 的列尽量要使用在有索引的列上,否则就会使用临时表和文件
group by可能会出现临时表(Using temporary),文件排序(Using filesort)等,影响效率。<br> 可以通过关联的子查询,来避免产生临时表和文件排序,可以节省io
explain select actor.first_name,actor.last_name,count(*) from film_actor inner join actor on actor.actor_id = film_actor.actor_id group by actor.actor_id\G
改写为:
explain select actor.first_name,actor.last_name,c.cnt from actor inner join (select actor_id,count(*) AS cnt from film_actor GROUP BY actor_id) AS c USING(actor_id)\G
GROUP BY优化