【问题标题】:MySQL Architecture OptimizationMySQL 架构优化
【发布时间】:2013-07-04 07:45:11
【问题描述】:

我已经尝试了两种方法,但随着输入量的增加,我无法确定哪一种通常会做得更好。

首先是背景故事:

我们有产品,每个产品都有一个类别路径(例如配饰-鞋-运动鞋)

我想将我的产品与其各自的类别联系起来,同时保持符合 3NF 规则的内容。

我可以通过这两种方式,我可以:

  1. 产品和类别之间具有多对多关系(通过将类别路径分解为单个类别并在多对多表中形成关联)

    优点:
    简单易懂。

    缺点:
    多对多关联呈指数增长!你可以想象为什么,每个产品都有多个类别,而测试用例只涉及 250,000 个产品。我可以直观地看到,随着输入大小的增加,数据库引擎的压力也会增加。

  2. 在类别路径和产品之间创建多对多关系,在类别路径和实际类别之间创建另一个多对多关系。这对我来说很有意义,因为 250,000 个产品的测试用例中的类别路径被限制为 13,000 个唯一实例,并且这些路径与它们在另一个多对多关系中的实际类别相关联的行不超过 61,000 行。

    优点:
    数据库快速处理的类别关联要少得多(61,000 个关联,而第一种技术形成的关联为 900,000 个)

    缺点:
    更多的内部连接。产品与类别路径相关联,而类别路径又与多对多关系中的类别相关联。

您认为哪种技术更合适?我需要 FAST 检索,因此快速选择语句应该是主要标准。

我意识到这在很大程度上取决于正确的索引,但在第一种情况下,行的大小至少增长了 3 倍,而在第二种情况下,内部连接太多,我担心速度的检索受到负面影响。

【问题讨论】:

    标签: mysql sql database performance database-design


    【解决方案1】:

    好的,所以我已经尝试了两种方法。事实证明,第二种技术要快得多。通过为每个产品存储相应的类别路径,产品和类别之间的映射表不可避免地返回的行数是 category_path 和连接到产品表的类别之间的映射表的十倍。

    这真的是简单的数学。故事的寓意:维护一个字典表(Category_Path)及其定义(Categories),并通过外键将字典表连接到每个相应的项目(Products)。更少的行让每个人都开心:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 2011-06-14
      • 2017-02-05
      • 2017-06-29
      • 2013-05-11
      • 1970-01-01
      • 2020-03-28
      • 2021-01-23
      相关资源
      最近更新 更多