MyISAM与InnoDB区别
|   MyISAM  |   Innodb  | |
|   存储结构  |   每张表被存放在三个文件:frm-表格定义、MYD(MYData)-数据文件、MYI(MYIndex)-索引文件  |   所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB  | 
|   存储空间  |   MyISAM可被压缩,存储空间较小;  |   InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引;  | 
|   可移植性、备份及恢复  |   由于MyISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作;  |   免费的方案可以是拷贝数据文件、备份binlog,或者用mysqldump,在数据量达到几十G的时候就相对痛苦了;  | 
|   文件格式  |   数据和索引是分别存储的,数据.MYD,索引.MYI;  |   数据和索引是集中存储的,.ibd;  | 
|   记录存储顺序  |   按记录插入顺序保存  |   按主键大小有序插入  | 
|   外键  |   不支持  |   支持  | 
|   主键  |   MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。  |   InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。InnoDB的主键范围更大,最大是MyISAM的2倍。  | 
|   事务  |   不支持  |   支持;默认开启,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。  | 
|   锁支持(锁是避免资源争用的一个机制,MySQL锁对用户几乎是透明的)  |   表级锁定  |   行级锁定、表级锁定,锁定粒度小并发能力高;  | 
|   INSERT、UPDATE、DELETE  |   InnoDB更优  | |
|   查询效率 select count(*)  |   myisam更快,因为myisam内部维护了一个计数器,可以直接调取。  | |
|   索引  |   MyISam主键索引和普通索引相同,都是保存的数据行的指针;  |   Innodb主键索引是聚簇索引,普通索引则是保存主键索引的值,普通索引查询需要一次额外的书签查找。  | 
|   数据安全性  |   MyIsam相较于Innodb数据容易损坏,不容易恢复;  | |
|   索引的实现方式  |   B+树索引,myisam是堆表  |   B+树索引,Innodb是索引组织表  | 
|   哈希索引  |   不支持  |   支持  | 
|   全文索引  |   支持  |   不支持  | 
|   分区支持  |   不支持  |   支持  | 
现在基本使用Innodb了,因为《MySQL 高性能》中有如下说法:
不要轻易相信“MyISAM 比 InnoDB 快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已知场景中,InnoDB 的速度都可以让 MyISAM 望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。










