MySQL存储引擎中MyISAM与InnoDB有哪些区别?

在MySQL 5.5之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

至于到底用哪种存储引擎比较好?要根据你的需求和环境来衡量。

所以对这两种引擎的概念、原理、异同和各自的优劣点有了详细的了解之后,再根据自己的情况选择起来就容易多了。

  MyISAM InnoDB
存储结构

每张表被存放在三个文件:

  1. .frm文件存储 -- 表格定义
  2. .MYD (MYData) -- 数据文件
  3. .MYI (MYIndex) -- 索引文件
所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。
存储空间 可被压缩,存储空间较小。 需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
可移植性、备份及恢复 由于数据以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。 免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。
事务安全 不支持 ,每次查询具有原子性。 支持, 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
AUTO_INCREMENT MyISAM:可以和其他字段一起建立联合索引。 InnoDB:必须包含只有该字段的索引。
SELECT MyISAM更优  
INSERT   InnoDB更优
UPDATE   InnoDB更优
DELETE   InnoDB更优。不会重新建表,而是一行一行删除。
COUNT without WHERE MyISAM更优。因为它保存了表的具体行数。  

COUNT with WHERE

一样 一样
只支持表锁 InnoDB:支持表锁和行锁,是innoDB的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。
外键 不支持 支持
FULLTEXT全文索引 支持 5.6+支持

MyISAM和InnoDB各有优劣,各有各的使用环境。

但是,InnoDB的设计目标是处理大容量数据库系统,它的CPU利用率是其它基于磁盘的关系数据库引擎所不能比的。

我觉得使用InnoDB可以应对更为复杂的情况,特别是对并发的处理要比MyISAM高效。同时结合memcache也可以缓存SELECT来减少SELECT查询,从而提高整体性能


我们应该如何选择?

    MyISAM:

    1). 可做很多count 的计算;

    2). 插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择;

    3). 没有事务。

    InnoDB:

    1). 可靠性要求比较高,或者要求事务;

    2). 表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建;

    3). 如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表;

    4). DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的 删除;

    5). LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

你可能感兴趣的:(MySQL)