【问题标题】:Should I always prefer MySQL InnoDB over MyISAM?我应该总是更喜欢 MySQL InnoDB 而不是 MyISAM 吗?
【发布时间】:2010-12-30 12:30:24
【问题描述】:

有人刚刚告诉我,InnoDB 比 MyISAM 好得多。所以当我创建一个表时,我是否应该总是尝试使用 InnoDB Engine 而不是 MyISAM?还是两者都有很大的好处?

【问题讨论】:

标签: mysql database-design innodb myisam


【解决方案1】:

简单的回答:不,你不应该。

关于每个引擎的几点说明:

InnoDB

  • 完全支持外键限制和事务。 (符合 ACID)
  • 行级锁定。
  • 可以说更快的 INSERT 语句。 (可能还有更新)

MyISAM

  • 更快的 SELECT 语句。
  • 支持全文搜索
  • BLOB 和 TEXT 列可以被索引
  • 最大存储限制是 InnoDB 的 4 倍(256TB 与 64TB)

在手册中查看更多信息:

【讨论】:

    【解决方案2】:

    你可以同时使用。您可以将 InnoDB 用于写入数据库/事务,但从非规范化的 MyISAM 数据库中读取。这提供了两全其美的效果。您知道您的数据在 InnoDB 的引用完整性下是安全的,并且您可以使用 MyISAM 尽可能快地读取它。

    【讨论】:

    • 能否请您参考如何使用这两个引擎的链接
    【解决方案3】:

    MyISAM 是无事务和堆组织的。记录由表中的行偏移量标识,索引将此偏移量存储为行指针。

    InnoDB 支持事务并且是索引组织的。记录由PRIMARY KEY 的值标识(或隐藏的内部列,没有定义PRIMARY KEY)并存储在B-Tree 中。二级索引将PRIMARY KEY 的值存储为行指针。

    涉及全表扫描或二级索引查找的查询通常在MyISAM 表上更快。

    涉及PRIMARY KEY 查找的查询通常在InnoDB 表上更快。

    MyISAM表将表中的记录数存储在表的元数据中,这就是为什么这样的查询:

    SELECT  COUNT(*)
    FROM    myisamtable
    

    即时。

    MyISAM 表完全锁定在 DML 操作上(有几个例外)。

    InnoDB 表锁定单个记录和索引间隙,但是这些是被扫描的记录和间隙,而不仅仅是那些与 WHERE 条件匹配的记录和间隙。这可能导致记录被锁定,尽管它们不匹配。

    InnoDB 表支持参照完整性 (FOREIGN KEYs)。 MyISAM 表没有。

    有几种情况可以显示两种引擎的优势。

    【讨论】:

      【解决方案4】:

      InnoDB 是一个完全符合 ACID 的数据库引擎,因此提供对事务等的支持。因此,它可能比 MyISAM 数据库慢,而 MyISAM 数据库倾向于在不同的方向进行优化。

      因此,如果您需要事务,InnoDB(或其他 RDBMS,如 PostgreSQL)是显而易见的选择。

      Wikipedia 上有一个合理的比较

      【讨论】:

        【解决方案5】:

        恕我直言,您应该始终更喜欢 InnoDB 而不是 MyISAM,因为事务支持是每个关系数据库系统的核心。

        【讨论】:

          【解决方案6】:

          简单地说:

          你应该使用 InnoDB:

          • 如果您需要交易支持
          • 如果您需要外键

          你应该使用 MyISAM:

          • 如果您不需要上述 AND
          • 您需要速度(更快的数据库操作)

          【讨论】:

          猜你喜欢
          • 2010-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多