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特性(例如外键)的表不适用。

相关文章
相关标签/搜索