MySQL 慢查詢日誌,用於辨識掃描表的查詢
MySQL 似乎沒有設置來顯示使用某些索引但仍然進行表掃描的查詢
我們有一些性能很差的查詢,並希望系統地找到它們,但該
log_queries_not_using_indexes
設置似乎只查找完全不使用索引的查詢,而不是使用全表掃描。有人要確認嗎?有新的選擇嗎?
我覺得
log_queries_not_using_indexes
沒用。更有用的是需要很長時間的查詢;這將包括執行部分或全部表掃描**且速度較慢的任何查詢,但不**包括快速的瑣碎表掃描。如果一個表有 5 行,它是使用索引還是進行表掃描並不重要——速度幾乎相同。
這些從最重要的查詢開始。我建議你處理前 3 個,然後等待影響發生並獲得新的慢日誌:
mysqldumpslow -s t # to sort by most impact first pt-query-digest
此外,
long_query_time=1
這可能是一個很好的起點。(我一直在聽;我沒有聽說過你建議的選項。你可以向 bugs.mysql.com 送出“功能請求”。)
更多的
優化器有時會決定表掃描可能比使用索引更快。當它估計超過 20% 的行將被觸及時,就會發生這種情況。(“20”隨月相而變化。)這是因為二級索引的 BTree 和數據 BTree 之間的彈跳有一定的成本。
就MySQL 5.7 - 5.4.5 慢查詢日誌的文件而言…
要在寫入慢查詢日誌的語句中包含不使用索引進行行查找的查詢,請啟用
log_queries_not_using_indexes
系統變數。…和
log_queries_not_using_indexes
不使用索引的查詢是否記錄到慢查詢日誌中。請參閱第 5.4.5 節,“慢查詢日誌”。
沒有提及與 相關的任何
log_queries_using_table_scans
內容或類似內容。MySQL 8-5.1.5 伺服器系統變數的文件中也沒有提及。所以,恐怕答案是否定的,沒有一個選項即將到來(至少,正如迄今為止所記錄的那樣)。所以,我的猜測是你必須記錄所有慢查詢,然後找出哪些進行表掃描,哪些不進行表掃描。
該
mysqldumpslow
實用程序可能會有所幫助。另請參閱MySQL 慢查詢日誌:用於解析慢查詢日誌的工具和技巧和工具。