瞭解查詢的整個生命週期,清楚每一個階段的時間消耗狀況html
參考
慢查詢日誌是優化很重要的手段,可是開啓慢查詢日誌對性能的影響並不大,因此能夠考慮在線上打開慢查詢日誌mysql
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%':查看某些變量的計數sql
查詢由多個子任務組成,優化查詢也就是優化子任務數據庫
不要請求不須要的數據緩存
mysql衡量查詢開銷的指標:性能優化
訪問類型
explain語句中的type指明瞭訪問類型,包括:全表掃描,索引掃描,範圍掃描,惟一索引查詢,常數引用,從左到右掃描的行數從多到少,速度從慢到快
查詢語句中where條件的使用,性能從好到壞是:服務器
優化器只關心隨機頁面的讀取函數
mysql提供了一些選項來干涉優化器的行爲,可是建議通常狀況下不要使用,由於通常干涉優化器帶來的收效較小,反而給版本升級的時候帶來一些問題性能
count(col):查詢該列值得個數(不包含null)
count(星號):查詢行數優化
使用關聯查詢代替子查詢,在mysql5.6和mariadb不須要考慮
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 all,由於使用union會在臨時表上加distinct,致使對整個臨時表作惟一性校驗