mysql - SQL 中的 JOIN 的成本如何?和/或,性能和标准化之间的权衡是什么?

标签 mysql sql performance join

我找到了一个类似的主题,但它并没有真正捕获我想要问的本质 - 所以我创建了一个新主题。

我知道规范化和性能之间存在权衡,我想知道绘制这条线的最佳做法是什么?在我的特定情况下,我的消息传递系统具有三个不同的表:messages_threads(总体消息持有者)、messages_recipients(参与人员)和messages_messages(实际消息+时间戳)。

为了返回“收件箱” View ,我必须将messages_threads 表、users 表和pictures 表左连接到messages_recipients 表,以获取填充 View 的信息(个人资料图片、发件人姓名、线程id)...我仍然需要添加一个消息连接以从最后一条消息中检索文本,以便向用户显示最后一条消息的“预览”。

我的问题是:SQL 中的 JOINS 对性能的影响有多大?例如,我可以在 messages_threads 表中名为“sendername”的字段下存储发件人的姓名(我必须让用户加入才能检索) - 但就规范化而言,我一直被教导要避免数据冗余?

你在哪里画线?还是我高估了 SQL 连接对性能的影响?

最佳答案

最佳做法是始终从 3NF 开始,然后仅在发现特定性能问题时才考虑去规范化。

性能只是您必须处理的数据库问题之一。通过复制数据,您冒着允许不一致数据存在于数据库中的风险,从而使关系数据库的核心原则之一——一致性(ACID 中的 C)无效一个

是的,加入是有代价的,这是无法避免的。然而,成本通常比您想象的要少得多,而且通常会被网络传输时间等其他因素所淹没。通过确保相关列的索引正确,您可以避免很多这样的成本。

并且,请记住优化口号:测量,不要猜测! 并在类似生产的环境中进行测量。并保持定期测量(和调整)- 如果您的模式和数据永远不会改变(非常不可能),优化只是一个设置和遗忘操作。


a) 通过使用触发器来保持一致性,通常可以安全地恢复性能。当然,这会减慢您的更新速度,但仍可能让您的选择运行得更快。

关于mysql - SQL 中的 JOIN 的成本如何?和/或,性能和标准化之间的权衡是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5773611/

相关文章:

javascript - 提高 html canvas mousemove 图像蒙版的性能

Python 获取 YQL 结果到 MySQL

php - 在两个不同的 while 循环中添加数字

mysql - JSON数据数组查询

java - Java/Scala内存统计数据库如何实现?

mysql - 使 MySQL 选择/更新更具体是否使其更快/提供更好的性能

mysql - 如何获得最小半径位置

mysql - Datanucleus 2.x 和 MySQL 错误 #13955027(设置选项)

mysql - 如何查找 mySQL DB 中没有重复的行?

mysql - 生成 16M 唯一随机数