【问题标题】:performance: joining tables vs. large table with redundant data性能:连接表与带有冗余数据的大表
【发布时间】:2012-01-01 08:43:33
【问题描述】:

假设我有一堆产品。每个产品都有由多个段落组成的 ID、价格和详细描述。每个产品还有多个代表不同尺寸和颜色的 sku 编号。

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

我可以有一个大表,每个 sku 都有不同的记录。这些记录会有冗长的字段,例如详细的描述和价格。

或者我可以有两张桌子。一个名为“产品”的产品,带有产品 ID、价格和描述。还有一个名为“skus”,带有 product_id、sku、color 和 size。然后我会加入 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 列上对所有 sku 进行 LIKE 搜索。我想比较一张有 5000 个 long_description 和 5000 个 sku 的表与 OUTER JOINing 两张表,一个有 1000 个 long_description 记录,另一个有 5000 个 sku。

【问题讨论】:

  • 一般来说,关于 SQL 的假设性“性能更好”的问题是不可能回答的。变量太多,其中很多取决于使用情况。请问一个更具体的问题。我们需要知道将运行什么样的查询、插入与选择的频率、索引结构、并发性等。
  • 性能做什么?只是列出所有内容?更新产品描述?添加新 SKU?
  • 在搜索表方面的性能。让我们使用 select/where color='green' 示例。拥有一个包含 5,000 个长描述的表,其中 1000 个是不同的,是否会比连接两个表(一个表只有 1000 个长描述)更慢选择查询?

标签: sql join


【解决方案1】:

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

通常的方法是仅对数据进行非规范化以解决您遇到的特定性能问题,因此在这种情况下,我的建议是默认连接两个表,并且仅在您有性能问题并发现非规范化解决了它。

【讨论】:

    【解决方案2】:

    OLTP 规范化表更好

    加入他们的查询,更容易的数据处理和对短查询的良好响应

    OLAP 非规范化表更好

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多