高效能Mysql筆記 優化

2021-08-15 21:19:47 字數 2425 閱讀 4260

了解查詢的整個生命週期,清楚每個階段的時間消耗情況

參考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.測試不同額硬體 ...