【问题标题】:MyISAM vs Innodb and Innodb related tablesMyISAM vs Innodb 和 Innodb 相关表
【发布时间】:2012-05-15 12:11:13
【问题描述】:

我正在创建的应用程序主要使用选择,但有些是插入、更新等。我想知道在这些情况下哪个最适合性能。

其次,当我在innodb中有两个相关的表时,如果它与另一个表中的一行相关,我如何删除一行而不吐出错误?

最后,如果我插入到一个表中,它会自动填写相关表的外键还是我已经编写了这个?

这个应用程序是用 PHP 编写的。

谢谢

【问题讨论】:

    标签: php mysql innodb myisam


    【解决方案1】:

    纯粹的性能方面的 MyISAM 在历史上(曾经?)优于 InnoDB。

    但考虑到 MyISAM 确实 完全支持参照完整性约束和事务并且使用/使用表级锁定,我肯定会选择 InnoDB .您在这里冒的是数据完整性的风险,并且您需要一个特殊的场景来保证对 MyISAM 的需求。

    关于您考虑相关表格的问题:只需将所需的cascade 选项提供给your foreign key constraints

    【讨论】:

    • 目前 MyISAM 的唯一优势是全文支持,即使在 MySQL 5.6(5.5?)的某个地方,它现在也在 InnoDB 中。除非您确实不需要行级锁定和/或事务,否则几乎没有理由使用 MyISAM。
    【解决方案2】:

    我正在创建的应用程序主要使用选择,但也有一些是插入、更新等。我想知道在这些情况下哪个最适合性能。

    更重要的问题是:您的数据是否损坏是否重要?如果是这样,您需要交易,这意味着 MyISAM 已退出。然后你就可以开始关心性能了,因为只有这样你才能实现第一个也是最重要的性能改进:应用程序从不工作到工作的地方。

    其次,当我在innodb中有两个相关的表时,如果它与另一个表中的一行相关,我如何删除一行而不吐出错误?

    先删除相关行,或者使用 ON DELETE CASCADE 定义外键约束 - 然后它会自动删除相关行;一个危险的功能。

    最后,如果我插入到一个表中,它会自动填写相关表的外键还是我已经编写了这个?

    不,是的。这并不神奇 - 应用程序如何知道其他列应该包含什么,或者您是否真的想要一个条目?

    【讨论】:

      【解决方案3】:

      主要使用选择,但有些是插入、更新

      视情况而定。读写量是多少? 80%? 90%? 95%?写入是与读取交错的还是分批执行的?数据库上有什么级别的并发访问?是否有特定的表写入繁重?

      MyISAM 的读取速度要快得多,但由于它会锁定整个表以进行写入,因此与 Innodb 相比,这是整体吞吐量下降的地方。

      对于具有隔夜 ETL 的数据仓库,MyISAM 再次具有净性能优势。对于非事务性 CMS(想想简单的发布工具),MyISAM 可能会更快。对于一个典型的基于 Web 的商店,您希望看到超过 95% 的读取,写入将主要隔离到特定表,并且一次更新几行 - 这里有点边缘化,最好的解决方案可能是是一种混合方法。 OTOH 对于具有频繁更新和大量并发访问(例如用于存储会话数据)的数据库,innodb 是要走的路。

      当我在 innodb 中有两个相关的表时,如果它与另一个表中的一行相关,我如何删除一行而不吐出错误?

      使用innodb并声明foreign key constraints

      如果我插入一张表,它会自动填写相关表的外键

      mysql如何知道表中要放什么数据?要添加多少行?你需要自己做。

      【讨论】:

        猜你喜欢
        • 2012-03-01
        • 2011-07-25
        • 1970-01-01
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 2014-02-03
        • 2011-11-05
        • 1970-01-01
        相关资源
        最近更新 更多