MySQL Workbench 在每次查詢後秘密執行 SHOW INDEX
幾天前,我修改了一些 innodb_stats_* 參數,並在一些 Percona 5.5.38 伺服器上執行了 mysqlcheck –analyze –all-databases。現在,每當我在 MySQL Workbench 中執行任何簡單查詢時,它似乎都會執行 SHOW INDEX ON t1 的後台查詢;不用說,當它阻止更新生產伺服器上的表時,這會導致一些問題。
我已經確定了這些事情:
- 任何具有足夠特權的帳戶都會發生這種情況
- 它不會從命令行發生
- 它發生在其他使用者身上
- 即使在我升級到 6.2.4 並刪除所有設置後也會發生
- 它不會發生在我的 Percona 5.6 數據庫中
- SHOW INDEX 在我的查詢後大約 5 秒開始
我無法在網上找到這種行為的任何解釋,所以想看看是否有任何有經驗的 DBA 遇到過這種情況。
目前統計相關設置:
- innodb_stats_auto_update 0
- innodb_stats_method nulls_equal
- innodb_stats_on_metadata 開啟
- innodb_stats_sample_pages 8
- innodb_stats_update_need_lock 1
- innodb_use_sys_stats_table 關閉
感謝任何人都可以提供的任何指示。
更新 查看原始碼後,事實證明 SHOW INDEX 發生在單個表上的每個查詢中。它檢查所選列是否包含主鍵或其他唯一索引,因此它可以決定您是否可以編輯數據。
原始碼包含以下註釋:
// XXX this can be slow because of the I_S queries, depending on the server
我去看看為什麼我的 INFORMATION_SCHEMA 很慢,並從 Percona 找到了一個有用的文章
事實證明,
innodb_stats_on_metadata
在此過程中已打開,這導致 MySQL 每次訪問 INFORMATION_SCHEMA 時都重新計算統計資訊。所以我只是把它關掉了。什麼樣的惡夢。
掃一掃 MySQL Workbench 的源碼可以看到一些 SHOW INDEX 發出的地方。應用程序需要為其任務執行相當多的查詢,例如索引視圖或表編輯器。其中一些僅在您從管理部分打開視圖時才處於活動狀態。其他的,比如 SQL 編輯器需要一個 SHOW INDEX 來查找關於 PK 列的資訊,這些資訊是決定是否可以編輯為查詢返回的結果集。