性能:连接表vs.具有冗余数据的大表



假设我有一堆产品。每个产品都有id、价格和由多个段落组成的长描述。每个产品也有多个sku号,代表不同的尺寸和颜色。

澄清一下:product_id 1有3个skus, product_id 2有5个skus。产品1中的所有skus都有相同的价格和描述。产品2的价格和描述与产品1不同。产品2的所有skus共享产品2的价格和描述。

我可以有一个大的表,每个sku有不同的记录。记录将有冗余字段,如长描述和价格。

或者我可以有两个表。一个名为"products",包含product_id、价格和描述。还有一个名为"skus",包含product_id、sku、颜色和大小。然后,我将在product_id列上连接这些表。

$query = "SELECT * FROM skus LEFT OUTER JOIN products ON skus.product_id=products.product_id WHERE color='green'";

$query = "SELECT * FROM master_table WHERE color='green'";

这是我的设置的简化版本。最后会有更多的专栏和更多的产品。哪种方法性能更好?

更具体地说:假设我想在long_description列上对所有skus进行LIKE搜索。我试图比较一个表有5000个long_description和5000个skus与OUTER连接两个表,一个有1000个long_description记录,另一个有5000个skus。

这取决于这些表的使用情况——为了得到一个明确的答案,你应该两者都做,并使用代表性的数据集/系统使用情况进行比较。

正常的方法是只对数据进行反规范化,以解决你所遇到的特定性能问题,所以在这种情况下,我的建议是默认跨两个表连接,只有当你有性能问题并发现反规范化可以修复它时,才对单个表进行反规范化。

OLTP规范化表更好

在查询中加入它们,更容易操作数据,并且对短查询有良好的响应

OLAP非规范化表更好

表大多不会改变,适合长查询

最新更新