性能:使用冗余数据连接表与大表

时间:2011-11-18 15:39:35

标签: sql join

让我们说我有一堆产品。每个产品都有由多个段落组成的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。我想比较一个表有5000个long_description和5000个skus vs OUTER JOINing两个表,一个有1000个long_description记录,另一个有5000个skus。

2 个答案:

答案 0 :(得分:2)

这取决于这些表的用法 - 为了获得确定的答案,您应该同时使用代表性数据集/系统使用情况进行比较。

正常的方法是仅对数据进行非规范化以解决您遇到的特定性能问题,因此在这种情况下,我的建议是默认加入两个表,并且如果您有一个表,则仅使用单个表进行非规范化性能问题并发现非规范化修复了它。

答案 1 :(得分:1)

OLTP更好地规范化表格

加入查询,更简单的数据管理和短查询的良好响应

OLAP非规范化表更好

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

相关问题