近日,公司有个业务日志的表超过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特性(例如外键)的表不适用。