Mysql

MySQL 慢查詢日誌,用於辨識掃描表的查詢

  • July 7, 2017

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 慢查詢日誌:用於解析慢查詢日誌的工具和技巧和工具。

引用自:https://dba.stackexchange.com/questions/177798