了解查詢的整個生命週期,清楚每個階段的時間消耗情況
參考select @@profiling:檢視profiling是否開啟
set profiling=1:開啟profiling
show profiles:檢視每條查詢的效能
show profile for query id:檢視query id的詳細時間花費
information_schema.profiling:該錶儲存了每個query的詳細時間花費
show status:檢視會話級別的計數器
show global status:檢視全域性的計數器
show status where variable_name like '%handler%':檢視某些變數的計數
查詢由多個子任務組成,優化查詢也就是優化子任務
消除一些子任務
減少子任務執行次數
讓子任務執行更快
不要請求不需要的資料
只返回必要的行(limit)、列(盡量不要使用星號返回所有列)
盡量不要查詢重複的資料,使用快取
mysql衡量查詢開銷的指標:
響應時間
掃瞄行數
返回的行數
訪問型別
explain語句中的type指明了訪問型別,包括:全表掃瞄,索引掃瞄,範圍掃瞄,唯一索引查詢,常數引用,從左到右掃瞄的行數從多到少,速度從慢到快
查詢語句中where條件的使用,效能從好到壞是:
在索引中使用where條件過濾不匹配的記錄,這是在儲存引擎層完成的
使用覆蓋引擎(extra中出現using index)來返回記錄,直接從索引過濾不需要的記錄並返回結果,在在伺服器層完成,不需要回表
在表中返回資料,使用where過濾不匹配的記錄(extra中出現using where),在服務層完成。mysql需要先讀資料然後過濾
切分查詢:將資料量大的查詢切分為幾次(有些情況分析查詢的效能更好,比如刪除資料,每次刪除10條比一次刪除100條來得好,當在資料庫業務繁忙的時候)
分解關聯查詢:
優化器只關心隨機頁面的讀取
關聯子查詢:有時候可以使用join的方式重寫關聯子查詢,效率更好
union的限制:mysql不能將條件放入union各個查詢中,重寫的時候可以把共同的條件寫入各個查詢中
索引合併優化:mysql可以利用同一張表上的多個索引,explain的時候type為index_merge,key為使用到的索引。如果存在合併(and的情況)那麼可以考慮將多個單列索引合為乙個多列索引
等值傳遞
並行執行:
鬆散索引
雜湊關聯
最大值和最小值:mysql的min和max函式
在同乙個表上查詢和更新:mysql不允許同時對一張表查詢和更新,可以使用join的方式來select需要在該錶上查詢的字段
mysql提供了一些選項來干涉優化器的行為,但是建議一般情況下不要使用,因為一般干涉優化器帶來的收效較小,反而給版本公升級的時候帶來一些問題
count
count(col):查詢該列值得個數(不包含null)
count(星號):查詢行數
myisam全表count(星號)很快
對於不精確的統計使用快取
優化關聯查詢
確保on和using列上有索引,a join b on col,那麼一般只需要在b的col建立索引就夠了
確保group by 和order by的表示式只涉及乙個表中的列,mysql才可以使用索引來優化
優化子查詢
使用關聯查詢代替子查詢,在mysql5.6和mariadb不需要考慮
優化group by和order by
group by的結果缺省會按照分組字段進行排序,如果不需要排序可以去掉排序,指定order by null
優化分頁查詢
當頁碼比較多的時候需要掃瞄的資料較大,這個時候可以使用覆蓋索引進行優化,先使用索引覆蓋查詢出limit的分頁資料,然後join該錶,查詢其他字段,這樣就減少了掃瞄的行數
select * from user_order inner join (select order_id from user_order order by buy_date limit 50, 5) as lim on lim.order_id=user_order.order_id;
或者可以記下該分界行的標識列(該列最好有索引),比如主鍵id,然後查詢基於該分界的記錄
select * from user_order where order_id > 500 order by order_id limit 5;
對於總記錄數,如果不那麼精確的話可以使用explain的rows
優化union查詢
除非有消除重複行的必要,否則使用union all,因為使用union會在臨時表上加distinct,導致對整個臨時表做唯一性校驗
使用自定義變數
學習筆記 《高效能MYSQL》對效能優化定義
本文屬於讀書筆記,大部分內容摘抄於 高效能mysql 摘抄內容版權屬於原作者。在 高效能mysql 中將西能定義為完成某件任務所需要的時間度量,換句話說,效能即響應時間。按照這個定義,我們通過任務和時間而不是資源來測量效能。原因是資料庫伺服器的目的是執行sql語句,所以它關注的任務是查詢或者語句,如...
《高效能MySQL》之MySQL查詢效能優化
響應時間過長。如果把查詢看做是乙個任務,那麼它由一系列子任務組成,每個子任務都會消耗一定的時間。如果要優化查詢,實際上優化其子任務,要麼消除其中一些子任務,要麼減少子任務的執行次數,要麼讓子任務執行得更快。查詢的生命週期 客戶端 伺服器 伺服器上解析 生成執行計畫 執行 返回結果給客戶端。其中 執行...
高效能Mysql 2 效能優化
基準測試 針對系統設計的一種壓力測試。基準測試的原因 1.驗證基於系統的一些假設,確認這些假設是否符合實際情況。2.重現系統中的某些異常行為,已解決這些異常。3.測試系統當前的運 況。4.模擬比當前系統更高的負載,找出系統可能遇到的擴充套件性瓶頸。5.測試應用適應可變環境的能力。6.測試不同額硬體 ...