mysql從innodb轉到MyIsam的count查詢效率極大提高

近日,公司有個業務日誌的表超過500萬後,count(*)須要4分55秒,將該表的存儲引擎從innodb轉換到MyIsam後,查詢效率極大提高,從4分55秒優化到0.01秒。mysql

下面是操做步驟:sql

mysql> select count(*) from tb_option_log; 用時4min55s優化

mysql> show table status from 庫名 where name='tb_option_log';  Engine顯示爲:InnoDBspa

mysql> alter table tb_option_log type ='myisam';日誌

mysql> show table status from 庫名 where name='tb_option_log';  Engine顯示爲:MyISAM索引

mysql> select count(*) from tb_option_log; 用時0.01sio

補充資料:innodb

MyISAM table

MyISAM 是MySQL缺省存貯引擎 .效率

每張MyISAM 表被存放在三個文件 。frm 文件存放表格定義。 數據文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引申。

由於MyISAM相對簡單因此在效率上要優於InnoDB..小型應用使用MyISAM是不錯的選擇.

MyISAM表是保存成文件的形式,在跨平臺的數據轉移中使用MyISAM存儲會省去很多的麻煩

如下是一些細節和具體實現的差異:

1.InnoDB不支持FULLTEXT類型的索引。

2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。注意的是,當count(*)語句包含 where條件時,兩種表的操做有些不一樣,InnoDB類型的表用count(*)或者count(主鍵),加上where col 條件。其中col列是表的主鍵以外的其餘具備惟一約束索引的列。這樣查詢時速度會很快。就是能夠避免全表掃描。

3.對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。

4.DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除。

5.LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。

相關文章
相關標籤/搜索