近日,公司有個業務日誌的表超過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特性(例如外鍵)的表不適用。