所以我开始为一家公司工作,他们有3到5个不同的表,经常在复杂的连接中或通过双重三重查询查询(我可能是第四个开始在这里工作的人,它非常凌乱)。
无论如何,我创建了一个表,当同时查询其他3或5个表时,将该数据与通常插入的任何信息一起插入到我的表中。它已经大大加快了许多应用程序的页面速度,我想知道我是否在这里犯了错误。
我希望将来删除插入其他表并简单地将所有信息插入到我已启动的表中并将应用程序切换到该表。它的速度要快得多。
有人能告诉我为什么将所有信息分组到一个庞大的表中会更快,如果这样做有任何不利之处?
答案 0 :(得分:1)
如果连接速度很慢,可能是因为表没有正确定义的FOREIGN KEY
关系和索引。如果表之前已经正确地进行了规范化,则可能不将它们非规范化为单个表是个好主意,除非它们不是 正确索引> STRONG>。 FOREIGN KEY
约束要求对PK表和相关FK列进行索引,因此如果它们尚不存在,只需定义这些约束可能会大大提高性能。
第一个操作过程是确保在开始非规范化之前正确定义表关系并对表进行索引。
有一个名为materialized views的概念,它通过将视图查询的结果存储到临时表中,作为结果集具有确定性的视图或查询的一种缓存。 MySQL不直接支持物化视图,但您可以通过偶尔从多表查询中选择所有行并将输出存储到表中来实现它们。当该表中的数据过时时,使用新的行集覆盖它。对于用于显示不经常更改的数据的简单SELECT
查询,您可以使用此方法加快页面加载速度。不建议将它用于不断变化的数据。
物化视图的一个很好用途可能是构建行来填充站点的下拉列表,或者存储仅每周运行一次的复杂报告的结果。对他们来说,一个不好的用途是存储客户订单信息,这需要及时访问。
答案 1 :(得分:0)
如果没有看到桌面结构等,那就太猜了。但听起来可能是数据库过度规范化了。
如果没有看到它,很难确切地说出问题所在。但您可能希望查看为表添加索引和外键。
如果要添加包含所有数据的表,则可能是对数据库进行非规范化。
答案 2 :(得分:0)
在某些情况下,对表进行反规范化有其优点,但我更感兴趣的是找出问题是否真的存在于表模式或查询的编写方式。您需要知道查询是否使用索引(或者是否需要将索引添加到表中),原始查询编写器是否执行了诸如使用子选择之类的事情,因为它们可能已经使用连接来提高查询效率等等。
我不会只是反规范化,因为它会使事情变得更快,除非有充分的理由。
答案 3 :(得分:0)
在新定义的表中拥有单独的数据副本是一种有效的性能增强实践,但另一方面,在保持表中的数据和其他数据相同时,它可能会变得非常混乱。你本质上有两个真理,但不知道如何在更新/删除时使这个“缓存”无效。
阅读更多关于“规范化”的内容并阅读有关MySQL中“EXPLAIN”的更多内容 - 它会告诉您为什么其他查询速度很慢,您可能会使用少量正确的索引和外键而不是复制数据。