myisam引擎的表缺少統計信息所導致的嚴重性能問題

myisam引擎的表缺少統計信息所導致的嚴重性能問題


內容提要:
mysql數據庫myisam引擎的表在默認狀態下,不會自動收集統計信息。
如果myisam引擎的表缺少統計信息,會導致一些sql語句莫名其妙地產生極其嚴重的性能問題。


數據庫版本:
mysql> show variables like '%version%';
+-------------------------+------------------------------+
| Variable_name           | Value                        |
+-------------------------+------------------------------+
| innodb_version          | 5.6.17                       |
| protocol_version        | 10                           |
| slave_type_conversions  |                              |
| version                 | 5.6.17                       |
| version_comment         | MySQL Community Server (GPL) |
| version_compile_machine | i686                         |
| version_compile_os      | Linux                        |
+-------------------------+------------------------------+
7 rows in set (0.03 sec)
mysql>


今天接手了一個myisam引擎的數據庫,在運行一個多表連接的sql語句時,
這條本該20多秒執行完的sql語句,居然運行了一個小時也沒有執行完。
查看執行計劃,發現執行計劃中的表連接順序亂七八糟,有的表竟沒有使用到索引,這與預想的執行計劃相去甚遠。
嘗試了多種優化辦法,都不見效。
最後通過analyze table命令將查詢中用到的各個表的統計信息收集一遍,問題終於得到了解決。


原來,myisam引擎的表在默認狀態下,不會自動收集統計信息。
而如果myisam引擎的表缺少統計信息,會導致一些sql語句莫名其妙地產生極其嚴重的性能問題。


那麼怎樣查看一個表是否收集了統計信息呢?方法如下:
select * from information_schema.STATISTICS where TABLE_SCHEMA='數據庫名' and TABLE_NAME='表名'\G
可以通過在執行結果中,查看主鍵索引的CARDINALITY(基數)部分,如果主鍵索引中存在CARDINALITY(基數)爲“NULL”的列,說明該表從來沒有被分析(收集統計信息)過。
如果主鍵索引中的所有列的CARDINALITY(基數)都與該表的記錄總數相等,則說明該表的統計信息是比較準確(比較新)的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章