優化group by查詢:
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;
上面這條sql 使用到了臨時表,文件排序,因此可以進行下列改寫:
Explain SELECT actor.first_name,actor.last_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);
此方法用了子查詢進行查詢優化
優化Limit查詢
limit常用於分頁處理,時常會伴隨order by從句使用,因此大多數時候會使用Filesorts這樣會造成大量的IO問題
SELECT film_id, description FROM sakila.film ORDER BY title LIMIT 50,5;
優化步驟1:使用有索引的列或者主鍵進行Order by 操作
SELECT film_id, description FROM sakila.film ORDER BY film_id LIMIT 50, 5;
步驟2:記錄上次返回的主鍵,在下次查詢時使用主鍵過濾
SELECT film_id, description FROM sakila.film WHERE film_id > 55 and film_id <= 60 ORDER BY film_id LIMIT 1, 5;此方法避免了數據量大時掃描過多的記錄
