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