-
優(yōu)化步驟 2:記錄上次返回的主鍵,在下次查詢時使用主鍵過濾
SELECT?film?id,?description?FROM?sakila.film?WHERE?film?id?>55?and?film?id?<=?60?ORDER?BY?film?id?LIMIT?1,?5;
*避免了數(shù)據(jù)量大時掃描過多的記錄
查看全部 -
優(yōu)化步驟 1:使用有索引的列或主鍵進(jìn)行 Order by 操作
SELECT?film_id,?description?FROM?sakila.film?ORDER?BY?film_id?LIMIT?50,?5;
查看全部 -
limit 常用于分頁處理,時常會伴隨 order by 從句使用,因此大多時候會使用 Filesorts 這樣會造成大量的 IO 問題。
SELECT?film_id,?description?FROM?sakila.film?ORDER?BY?title?LIMIT?50,?5;
查看全部 -
優(yōu)化 group by 查詢一優(yōu)化后
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);
在子查詢內(nèi)加過濾條件
查看全部 -
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;
查看全部 -
通常情況下,需要把子查詢優(yōu)化為 join 查詢,但在優(yōu)化時要注意關(guān)聯(lián)建是否有一對多的關(guān)系,要注意重復(fù)數(shù)據(jù)。
(查詢 sandra 出演的所有影片)
explain?SELECT?title,?release_year,?LENGTH? FROM?film WHERE?film_id?IN( ??SELECT?film_id?FROM?film_actor?WHERE?actor_id?IN ????SELECT?actor_id?FROM?actor?WHERE?first_name?=?'sandra'))
查看全部 -
在一條 SQL 中同時查出 2006 年和 2007 年電影的數(shù)量一優(yōu)化 count0 函數(shù)正確的方式:
SELECT?COUNT?(release_year='2006'?OR?NULL)?AS?'2006?年電影數(shù)量',?COUNT?(release_year='2007’?OR?NULL)?AS?'2007?年電影數(shù)量'?FROM?film;
查看全部 -
在一條 SQL 中同時查出 2006 年和 2007 年電影的數(shù)量一優(yōu)化 count() 函數(shù)
錯誤的方式:
SELECT?COUNT?(release_year='2006'?OR?release_year='2007')?FROM?film;
無法分開計算?2006?和?2007?年的電影數(shù)量
SELECT?COUNT?(*)?FROM?film?WHERE?release_year='2006'?AND?release_year?='2007';
Release_year 不可能同時為 2006 和 2007,因此上有邏輯錯誤
查看全部 -
查詢最后支付時間一優(yōu)化 max() 函數(shù)
select?max(payment_date)?from?payment;
查看全部 -
extra 列需要注意的返回值
Using filesort:看到這個的時候,查詢就需要優(yōu)化了。MYSQL 需要進(jìn)行額外的步驟來發(fā)現(xiàn)如何對返回的行排序。它根據(jù)連接類型以及存儲排序鍵值和匹配條件的全部行的行指針來排序全部行
Using temporary 看到這個的時候,查詢需要優(yōu)化了。這里,MYSQL 需要創(chuàng)建一個臨時表來存儲結(jié)果,這通常發(fā)生在對不同的列集進(jìn)行 ORDER BY 上,而不是 GROUP BY 上
查看全部 -
如何分析 SQL 查詢
使用 explain 查詢 SQL 的執(zhí)行計劃
explain 返回各列的含義
table:顯示這一行的數(shù)據(jù)是關(guān)于哪張表的
type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為 const、eq_reg、ref、range、index 和 ALL
possible_keys:顯示可能應(yīng)用在這張表中的索引。如果為空,沒有可能的索引。
key:實際使用的索引。如果為 NULL,則沒有使用索引。
key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好
ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數(shù)
rows:MYSQL 認(rèn)為必須檢查的用來返回請求數(shù)據(jù)的行數(shù)
查看全部 -
如何通過慢查日志發(fā)現(xiàn)有問題的 SQL?
查詢次數(shù)多且每次查詢占用時間長的 SQL?
通常為 pt-query-digest 分析的前幾個查詢
IO 大的 SQL
注意 pt-query-digest 分析中的 Rows examine 項
未命中索引的 SQL
注意 pt-query-digest 分析中 Rows examine 和 Rows Send 的對比
查看全部 -
慢查日志的分析工具—— pt-query-digest 輸出
查看全部 -
慢查日志的分析工具
輸出到文件
pt-query-digest slow-log > slow_log.report
輸出到數(shù)據(jù)庫表
pt-query-digest slow.log -review \
h=127.0.0.1, D=test, p=root, P=3306, u=root, t=query_review \
--create-reviewtable \
--review-history t= hostname_slow
查看全部 -
慢查日志的分析工具 —— mysqldumpslow 輸出
查看全部
舉報