mysql innodb 慢查詢問題定位實踐

2021-09-27 01:18:56 字數 2594 閱讀 5602

最近對線上的慢查詢做了乙個分析和優化,這裡做一下總結,使用的引擎規定都是innodb,架構是三主集群,半自動同步,需三颱機都寫入成功才返回

問題一:每日0點左右,資料庫寫入時間很長,甚至十幾秒

分析:經過排查,發現是0點左右會有一些資料備份的操作,刪除n天之前的備份資料,新增前一天的新備份資料,資料量達到百萬級別,這樣一刪一增,三主之間還需要同步資料,這個時間持續了幾分鐘,在這段時間內,資料庫基本屬於阻塞狀態,基本無法寫入,所以其他的操作都是超時

解決:有資料庫集群的話都要考慮到資料的同步問題,不能一次刪除大量或者插入大量,或者更新大量資料,最後採取批量刪除,批量新增的方式解決,即每次刪除10000條,等1秒後繼續刪10000條,新增也是一樣,這樣做了之後,就解決這個問題了

問題二:where in的條件裡面有上萬個條件,導致查詢慢

分析:因為考慮到資料庫的遷移問題,所以嚴禁使用join操作,兩個表之間的關聯都是用in來關聯,當一次關聯的資料多了,達到成千上萬條,慢查詢就來了

解決:作乙個判斷,如果in裡面的長度大於1000,則查全量的資料,返回後再用程式過濾,這種處理方式目前沒問題,但是如果關聯的資料達到了上百萬,就會記憶體不足了,但是短期內還不至於

問題三:查詢待傳送訊息慢查詢,實際沒有待傳送資料

分析:這是乙個很常見的查詢,看起來也沒什麼問題,根據傳送狀態status和時間查資料,時間有索引,status沒索引,可能是受一種說法的影響,建索引要建區分度高的,status這種一般只有幾種狀態,區分度不高,沒有必要建索引,所以這裡status沒有建索引

解決:把status加上索引,時間提公升了幾百倍,從幾秒變成了0.0幾秒,其實這裡有兩個誤區:1,待傳送的數量畢竟少,區分度還是高的,2,就算區分度不高,建索引也會快,因為innodb,如果查詢條件沒有索引,會全表掃瞄,有了索引不會全表掃瞄了,通過普通索引找出主鍵索引然後找出資料,速度和全表掃瞄也不是乙個級別

問題四:獲取某條件下主鍵最大值的慢查詢

分析:這也是乙個很常見的sql,select id from table where date <= 『2019-07-29』 order by id desc limit 1;date有索引,但是很不巧的是,因為用了<=,不符合字首索引條件啥的,所以主鍵索引失效了,就很慢了

解決:使用max函式解決

explain 推薦指數三星

最常見的分析方法了,有些時候有效,可以等到:

表的讀取順序

資料讀取操作的操作型別

哪些索引可以使用

哪些索引被實際使用

表之間的引用

每張表有多少行被優化器查詢

主要看rows,key,來判斷實際查詢條數和索引使用情況

但是很多時候通過這個並不能看出一條查詢的瓶頸在**

show processlist 推薦指數二星

processlist命令的輸出結果顯示了有哪些執行緒在執行,不僅可以檢視當前所有的連線數,還可以檢視當前的連線狀態幫助識別出有問題的查詢語句等。

能看出當前語句的運**況,但是因為是實時的,所以很難跟蹤到具體什麼操作執行時間長

show profile 推薦指數五星

這裡強烈推薦 profile,這個操作預設關閉,可以手動開啟,而是該操作是會話級別的,也就是說開啟了之後只會輸出你當前連線的sql執**況,不影響其他的操作

首先開啟profile

mysql> set profiling = 1;

之後執行一條sql:select * from test limit 1;

接下來,如果執行:

show profile;(注意少個s),則會預設返回最近的一條查詢的資訊

再執行 一條:select * from test limit 2; show profiles;

有兩條記錄了,執行 show profile all for query 1;根據上面的query_id查詢對應語句的執**況

all這裡需要說明一下:

all表示查詢的type是,可選的,取值範圍可以如下:

all 顯示所有效能資訊

block io 顯示塊io操作的次數

context switches 顯示上下文切換次數,不管是主動還是被動

cpu 顯示使用者cpu時間、系統cpu時間

ipc 顯示傳送和接收的訊息數量

memory [暫未實現]

page faults 顯示頁錯誤數量

source 顯示原始碼中的函式名稱與位置

swaps 顯示swap的次數

看到沒有,不僅僅會有該條語句執行的各個階段的時間,還有各個階段的cpu消耗,io消耗的情況,**有問題基本一目了然了

mysql 慢查詢 MySQL慢查詢

一 簡介 開啟慢查詢日誌,可以讓mysql記錄下查詢超過指定時間的語句,通過定位分析效能的瓶頸,才能更好的優化資料庫系統的效能。二 引數說明 slow query log 慢查詢開啟狀態 slow query log file 慢查詢日誌存放的位置 這個目錄需要mysql的執行帳號的可寫許可權,一般...

MySQL慢查詢 檢視慢查詢日誌

在mysql 中,慢查詢日誌主要用來記錄響應時間超過閾值的sql。響應時間超過 long query time 預設值為 10秒 會被記錄到慢查詢日誌中,日誌可以設定為檔案或者資料庫表。在命令列輸入如下命令可以檢查慢查詢日誌是否被開啟 show variables like query 如果slow...

sql查詢慢 查詢

select creation time n 語句編譯時間 last execution time n 上次執行時間 total physical reads n 物理讀取總次數 total logical reads execution count n 每次邏輯讀次數 total logical ...