Wal*_*ker 13 mysql sql performance join
我发现了一个类似的线程,但它并没有真正捕捉到我想要问的内容 - 所以我创建了一个新线程.
我知道在规范化和性能之间需要权衡,我想知道绘制这条线的最佳做法是什么?在我的特定情况下,我有一个消息传递系统,它有三个不同的表:messages_threads(总体消息持有者),messages_recipients(涉及谁)和messages_messages(实际消息+时间戳).
为了返回"收件箱"视图,我必须将messages_threads表,users表和图片表连接到messages_recipients表,以便获取填充视图的信息(配置文件图片,发件人名称,线程ID). ..然后我仍然添加一个连接到消息以从最后一条消息中检索文本,以便向用户显示最后一条消息的"预览".
我的问题是:SQL中的JOINS对性能的代价是多少?例如,我可以在messages_threads表中名为"sendername"的字段下存储发件人的名称(我必须从用户那里继续加入) - 但就标准化而言,我一直被教导要避免数据冗余?
你在哪里划线?或者我是否高估了性能阻碍SQL连接的方式?
pax*_*blo 22
最佳实践是始终以3NF开始,然后仅在发现特定性能问题时才考虑非规范化.
性能只是您必须处理数据库的问题之一.通过复制数据,您可能会在数据库中存在允许不一致数据的风险,从而使关系数据库的核心原则之一,即一致性(C
in ACID
)a无效.
是的,加入有成本,没有解决这个问题.但是,成本通常比您想象的要低很多,并且经常会受到网络传输时间等其他因素的影响.通过确保相关列正确编制索引,可以避免大量的成本.
并且,记住优化口头禅:措施,不要猜!并在类似生产的环境中进行衡量.和保持测量(和调整)定期-优化是只有一套,忘记操作,如果你的架构和数据不会改变(不太可能).
a)通过使用触发器来保持一致性,通常可以使性能恢复变得安全.当然,这会降低您的更新速度,但仍可能让您的选择运行得更快.