MySql:MyISAM与Innodb!

时间:2008-11-10 09:42:23

标签: mysql database innodb myisam

MySql中的MyISAM和Inno数据库类型有什么区别?

12 个答案:

答案 0 :(得分:54)

主要区别在于InnoDB支持交易,而MyISAM则不支持。

还有许多其他差异,但我所知道的常见的是:

  • MyISAM通常被认为在搜索方面更快,但最近的InnoDB改进正在消除这种差异并提高高并发工作负载性能
  • InnoDB支持交易,而MyISAM不支持
  • InnoDB支持参照完整性,而MyISAM不支持
  • InnoDB处理索引的方式略有不同,将主键存储为每个索引的一部分(使索引在磁盘上占用更多空间,但也更有可能覆盖索引)
  • MyISAM执行表级锁定,而InnoDB可以执行行级锁定
  • MySQL配置文件中使用了不同的内存/缓冲区/索引设置
  • InnoDB通常被认为具有更好的崩溃恢复能力
  • 如另一个答案所述,数据以不同方式存储在磁盘上。我相信InnoDB可以在这个区域配置,如果需要,每个表可以有一个文件等

我确信谷歌搜索或MySQL网站会更详细地提出许多其他差异。

答案 1 :(得分:19)

  

InnoDB和MyISAM

功能和效果比较:

  1. InnoDB较新,而MyISAM较旧。
  2. InnoDB更复杂,而MyISAM更简单。
  3. InnoDB在数据完整性方面更严格,而MyISAM则松散。
  4. InnoDB在插入和更新时实现行级锁定,而MyISAM实现了表级锁定。
  5. InnoDB有交易而MyISAM没有交易。
  6. InnoDB有外键和关系约束,而MyISAM没有。
  7. InnoDB具有更好的崩溃恢复能力,而MyISAM在恢复系统崩溃时的数据完整性方面表现不佳。
  8. MyISAM有全文搜索索引,而InnoDB没有。
  9. 鉴于这些差异,InnoDB和MyISAM彼此之间有着独特的优势和劣势。它们在某些情况下比其他情况更适合。

    InnoDB的优势

    1. InnoDB应该用于数据完整性优先的地方,因为它通过关系约束和交易的帮助固有地处理它们。
    2. 写入密集型(插入,更新)表更快,因为它使用行级锁定,只保留对正在插入或更新的同一行的更改。
    3. InnoDB的缺点

      1. 由于InnoDB必须处理表之间的不同关系,因此数据库管理员和方案创建者必须花费更多时间来设计比MyISAM更复杂的数据模型。
      2. 消耗更多系统资源,例如RAM。事实上,如果安装MySQL后没有实质性的需要,很多人都会建议关闭InnoDB引擎。
      3. 没有全文索引。
      4. MyISAM的优势

        1. 设计和创作更简单,因此对初学者更好。不用担心表之间的外来关系。
        2. 由于结构更简单,整体上比InnoDB更快,因此服务器资源的成本更低。
        3. 全文索引。
        4. 特别适合阅读密集型(精选)表格。
        5. MyISAM的缺点

          1. 没有数据完整性(例如关系约束)检查,这就是数据库管理员和应用程序开发人员的责任和开销。
          2. 不支持在关键数据应用程序(如银行业务)中必不可少的交易。
          3. 经常插入或更新的表比InnoDB慢,因为整个表都被锁定以进行任何插入或更新。
          4. 比较非常简单。 InnoDB更适合需要频繁插入和更新的数据关键情况。另一方面,MyISAM在不完全依赖数据完整性的应用程序中表现更好,而且大多只选择并显示数据。

            <强> 参考: Comparison InnoDB and MyISAM

            您也可以在此处查看更多详情: MyISAM Or InnoDB MySQL engine?

            希望这有帮助。

答案 2 :(得分:16)

MyISAM支持(非标准SQL)全文索引,InnoDB仍然没有。这是我们今天使用MyISAM的唯一原因。

答案 3 :(得分:4)

MyISAM和InnoDB之间最重要的区别是InnoDB支持事务和外键。如果您需要外键和相关功能(例如自动级联删除),则需要使用InnoDB。

InnoDB在大多数情况下比MyISAM慢,但由于更好的锁定机制,在某些条件下可以更快地执行;当插入/更新正在执行时,MyISAM锁定整个表以进行读取。 InnoDB可以进行行级锁定,从而允许在表上进行多次并发写入和读取。

答案 4 :(得分:3)

您可以获得有关MyISAM和更多信息的更多信息。 MySQL文档中的InnoDB:

http://dev.mysql.com/doc/refman/5.1/en/myisam-storage-engine.html

http://dev.mysql.com/doc/refman/5.1/en/innodb-overview.html

答案 5 :(得分:1)

主要区别在于InnoDB支持transactions,而MyISAM则不支持。{/ p>

答案 6 :(得分:1)

MyISAM和InnoDB也以不同方式将数据存储在磁盘上。 MyISAM为每个表使用数据文件和索引文件,存储在以数据库命名的目录中。 InnoDB似乎将所有内容整合在一个名为ibdata1的文件中。

答案 7 :(得分:1)

NFS支持

与MyISAM不同,InnoDB可能在NFS上存在问题。

来自Configuring InnoDB (MySQL version 5.5)

  

注意

     

如果考虑可靠性   你的数据,不要配置InnoDB   在NFS上使用数据文件或日志文件   卷。潜在问题各不相同   根据操作系统和NFS的版本,   并包括缺乏这样的问题   保护免受冲突的写入,   和最大文件大小的限制。

答案 8 :(得分:1)

InnoDB功能 1.提供完整的交易功能,完全符合ACID(原子性,一致性,隔离性和耐久性)。

  1. 它具有行级锁定。通过支持行级锁定,您可以将数据添加到InnoDB表,而无需引擎使用每个插入锁定表,这样可以加速数据库中信息的恢复和存储。

  2. InnoDB系统的关键是数据库,缓存和索引结构,其中索引和数据都缓存在内存中并存储在磁盘上这样可以实现非常快速的恢复,甚至可以在非常大的数据集上运行

  3. InnoDB支持外键约束

  4. InnoDB支持自动崩溃恢复
  5. InnoDB支持表压缩(读/写)
  6. InnoDB支持空间数据类型(无空间索引)

  7. Innodb支持非锁定ANALYZE TABLE,仅在服务器运行了很长时间后才需要,因为它潜入索引统计信息并在表打开时获取索引信息。

  8. Innodb没有单独的索引文件,因此无需打开它们。

  9. Innodb以主键顺序(在ALTER之后)一次构建一行索引,这意味着索引树不是按最佳顺序构建并且是碎片化的。目前无法对InnoDB索引进行碎片整理,因为InnoDB无法通过在MySQL 5.0中排序来构建索引。即使丢弃并重新创建InnoDB索引,也可能导致索引碎片,具体取决于数据。

  10. 一个表最多可包含1000列。

  11. InnoDB内部最大密钥长度为3500字节,但MySQL本身将此限制为3072字节。 (对于MySQL 5.0.17之前的非64位构建,以及5.0.15之前的所有构建,为1024字节。)

  12. InnoDB中的默认数据库页面大小为16KB。通过重新编译代码,您可以将其设置为8KB到64KB之间的值。您必须在univ.i源文件中更新UNIV_PAGE_SIZE和UNIV_PAGE_SIZE_SHIFT的值。
  13. InnoDB表不支持FULLTEXT索引。

    MYISAM特色

    1. 无交易支持
    2. 表级锁定
    3. 提供全文搜索
    4. 表格中的数据没有限制。
    5. 快速COUNT(*)s(当不使用WHERE,GROUP BY或JOIN时)
    6. 全文索引
    7. 更小的磁盘空间
    8. 非常高的表压缩(只读)
    9. 空间数据类型和索引(R-tree)
  14. 通过使用DATA DIRECTORY ='/ path / to / data / directory'或INDEX DIRECTORY ='/ path / to / index / directory',您可以指定MyISAM存储引擎的位置 放一个表的数据文件和索引文件。该目录必须是目录的完整路径名,而不是相对路径。
  15. 你可以在这里找到更多细节 http://faisalbhagat.blogspot.com/2014/09/innodb-vs-myisam.html

答案 9 :(得分:0)

以下是InnoDB和MyIsam之间差异的描述:

Differences between InnoDB and MyIsam

几乎没有差异:

  • MYISAM 不支持任何数据库事务,
  • INNODB 将提供交易
  • MYISAM 提供表级锁定,
  • INNODB 提供行级锁定
  • INNOBD 支持外键, MYISAM 不支持...

答案 10 :(得分:0)

MyISAM在备份方面更方便,因为只需锁定所有表并直接在文件系统中复制文件就相当简单。 (mysqlhotcopy这是一个perl-script甚至是mysql afaik的一部分)

InnoDB有点复杂,只是复制文件是行不通的,因为它们无法在另一台开箱即用的机器上恢复。

然而,有商业软件提供InnoDB hotcopying。

答案 11 :(得分:0)

虽然事务支持是主要区别,但如果您有long-running SELECT queries mixed with UPDATE statements,则表级锁定可能会成为问题。