【发布时间】:2012-05-15 12:11:13
【问题描述】:
我正在创建的应用程序主要使用选择,但有些是插入、更新等。我想知道在这些情况下哪个最适合性能。
其次,当我在innodb中有两个相关的表时,如果它与另一个表中的一行相关,我如何删除一行而不吐出错误?
最后,如果我插入到一个表中,它会自动填写相关表的外键还是我已经编写了这个?
这个应用程序是用 PHP 编写的。
谢谢
【问题讨论】:
我正在创建的应用程序主要使用选择,但有些是插入、更新等。我想知道在这些情况下哪个最适合性能。
其次,当我在innodb中有两个相关的表时,如果它与另一个表中的一行相关,我如何删除一行而不吐出错误?
最后,如果我插入到一个表中,它会自动填写相关表的外键还是我已经编写了这个?
这个应用程序是用 PHP 编写的。
谢谢
【问题讨论】:
纯粹的性能方面的 MyISAM 在历史上(曾经?)优于 InnoDB。
但考虑到 MyISAM 确实 不 完全支持参照完整性约束和事务并且使用/使用表级锁定,我肯定会选择 InnoDB .您在这里冒的是数据完整性的风险,并且您需要一个特殊的场景来保证对 MyISAM 的需求。
关于您考虑相关表格的问题:只需将所需的cascade 选项提供给your foreign key constraints。
【讨论】:
我正在创建的应用程序主要使用选择,但也有一些是插入、更新等。我想知道在这些情况下哪个最适合性能。
更重要的问题是:您的数据是否损坏是否重要?如果是这样,您需要交易,这意味着 MyISAM 已退出。然后你就可以开始关心性能了,因为只有这样你才能实现第一个也是最重要的性能改进:应用程序从不工作到工作的地方。
其次,当我在innodb中有两个相关的表时,如果它与另一个表中的一行相关,我如何删除一行而不吐出错误?
先删除相关行,或者使用 ON DELETE CASCADE 定义外键约束 - 然后它会自动删除相关行;一个危险的功能。
最后,如果我插入到一个表中,它会自动填写相关表的外键还是我已经编写了这个?
不,是的。这并不神奇 - 应用程序如何知道其他列应该包含什么,或者您是否真的想要一个条目?
【讨论】:
主要使用选择,但有些是插入、更新
视情况而定。读写量是多少? 80%? 90%? 95%?写入是与读取交错的还是分批执行的?数据库上有什么级别的并发访问?是否有特定的表写入繁重?
MyISAM 的读取速度要快得多,但由于它会锁定整个表以进行写入,因此与 Innodb 相比,这是整体吞吐量下降的地方。
对于具有隔夜 ETL 的数据仓库,MyISAM 再次具有净性能优势。对于非事务性 CMS(想想简单的发布工具),MyISAM 可能会更快。对于一个典型的基于 Web 的商店,您希望看到超过 95% 的读取,写入将主要隔离到特定表,并且一次更新几行 - 这里有点边缘化,最好的解决方案可能是是一种混合方法。 OTOH 对于具有频繁更新和大量并发访问(例如用于存储会话数据)的数据库,innodb 是要走的路。
当我在 innodb 中有两个相关的表时,如果它与另一个表中的一行相关,我如何删除一行而不吐出错误?
使用innodb并声明foreign key constraints
如果我插入一张表,它会自动填写相关表的外键
mysql如何知道表中要放什么数据?要添加多少行?你需要自己做。
【讨论】: