我找到了一个类似的主题,但它并没有真正捕获我想要问的本质 - 所以我创建了一个新主题。
我知道规范化和性能之间存在权衡,我想知道绘制这条线的最佳做法是什么?在我的特定情况下,我的消息传递系统具有三个不同的表: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/