MySQL執行SQL會經過SQL解析和查詢優化的過程,解析器將SQL分解成數據結構并傳遞到后續步驟,查詢優化器發現執行SQL查詢的最佳方案、生成執行計劃。查詢優化器決定SQL如何執行,依賴于數據庫的統計信息,下面我們介紹MySQL 5.7中innodb統計信息的相關內容。
MySQL統計信息的存儲分為兩種,非持久化和持久化統計信息。
非持久化統計信息存儲在內存里,如果數據庫重啟,統計信息將丟失。有兩種方式可以設置為非持久化統計信息:
| 1 全局變量, INNODB_STATS_PERSISTENT=OFF |
| 2 CREATE/ALTER表的參數, STATS_PERSISTENT=0 |
非持久化統計信息在以下情況會被自動更新:
| 1 執行ANALYZE TABLE |
| 2 innodb_stats_on_metadata=ON情況下,執SHOW TABLE STATUS, SHOW INDEX, 查詢 INFORMATION_SCHEMA下的TABLES, STATISTICS |
| 3 啟用--auto-rehash功能情況下,使用mysql client登錄 |
| 4 表第一次被打開 |
| 5 距上一次更新統計信息,表1/16的數據被修改 |
非持久化統計信息的缺點顯而易見,數據庫重啟后如果大量表開始更新統計信息,會對實例造成很大影響,所以目前都會使用持久化統計信息。
5.6.6開始,MySQL默認使用了持久化統計信息,即INNODB_STATS_PERSISTENT=ON,持久化統計信息保存在表mysql.innodb_table_stats和mysql.innodb_index_stats。
持久化統計信息在以下情況會被自動更新:
| 1 INNODB_STATS_AUTO_RECALC=ON 情況下,表中10%的數據被修改 |
| 2 增加新的索引 |
innodb_table_stats是表的統計信息,innodb_index_stats是索引的統計信息,各字段含義如下:
| innodb_table_stats | |
| database_name | 數據庫名 |
| table_name | 表名 |
| last_update | 統計信息最后一次更新時間 |
| n_rows | 表的行數 |
| clustered_index_size | 聚集索引的頁的數量 |
| sum_of_other_index_sizes | 其他索引的頁的數量 |
新聞熱點
疑難解答