1

所以我开始在一家公司工作,他们有 3 到 5 个不同的表,这些表经常通过复杂的连接或双重、三重查询进行查询(我可能是第四个开始在这里工作的人,这非常混乱)。

无论如何,我创建了一个表,当同时查询其他 3 或 5 个表时,将该数据连同通常插入到那里的任何信息一起插入到我的表中。它极大地加快了许多应用程序的页面速度,我想知道我是否在这里犯了错误。

我希望将来可以删除插入到其他表中的操作,只需将所有信息插入到我已经启动的表中,然后将应用程序切换到那个表。它只是快了很多。

有人可以告诉我为什么将所有信息分组到一张大表中要快得多,这样做是否有任何不利之处?

4

4 回答 4

1

如果连接速度很慢,可能是因为表没有FOREIGN KEY正确定义关系和索引。如果这些表之前已正确规范化,那么将它们非规范化为单个表可能不是一个好主意,除非它们在适当的索引下不具有性能。 FOREIGN KEY约束需要在 PK 表和相关的 FK 列上建立索引,因此如果这些约束不存在,则简单地定义它们可能对提高性能大有帮助。

第一步是确保在开始非规范化之前正确定义表关系并为表建立索引。

有一个称为物化视图的概念,它通过将视图查询的结果存储到临时表中,作为结果集是确定性的视图或查询的一种缓存。MySQL 不直接支持物化视图,但您可以通过偶尔从多表查询中选择所有行并将输出存储到表中来实现它们。当该表中的数据过时时,您将使用新的行集覆盖它。SELECT对于用于显示不经常更改的数据的简单查询,您可以使用此方法加快页面加载速度。不建议将其用于不断变化的数据。

物化视图的一个很好的用途可能是构建行来填充站点的下拉列表或存储每周只运行一次的复杂报告的结果。对它们来说,一个不好的用途是存储需要及时访问的客户订单信息。

于 2012-08-20T15:32:03.003 回答
0

如果没有看到表结构等,那将是猜测。但听起来可能是数据库过度规范化了。

如果没有看到它,很难确切地说出问题是什么。但是您可能想查看向表中添加索引和外键。

如果要添加一个包含所有数据的表,则可能是在对数据库进行非规范化。

于 2012-08-20T15:33:32.770 回答
0

在某些情况下,对表进行非规范化有其优势,但我更感兴趣的是找出问题是否真的出在表模式或查询的编写方式上。您需要知道查询是否使用索引(或者是否需要将索引添加到表中),原始查询编写器是否在本可以使用连接来提高查询效率时使用子选择等操作。

我不会仅仅因为它使事情变得更快而去规范化,除非有充分的理由。

于 2012-08-20T15:35:01.763 回答
0

在新定义的表中拥有一个单独的数据副本是一种有效的性能增强实践,但另一方面,在保持表中的数据和其他表中的数据相同时,它可能会变得一团糟。您基本上有两个事实,在更新/删除时不知道如何使这个“缓存”无效。

阅读更多关于“规范化”和阅读更多关于 MySQL 中的“解释”的信息——它会告诉你为什么其他查询很慢,你可能会用很少的正确索引和外键而不是复制数据来逃避。

于 2012-08-20T15:36:02.437 回答