【问题标题】:Suggested indices for a MPTT tableMPTT 表的建议索引
【发布时间】:2010-12-08 13:10:15
【问题描述】:

我只是在构建一个表来使用修改的预排序树遍历 (MPTT) 存储分层数据——你知道的:每个节点都存储 leftright ID 以查找其后代。我使用的是 CakePHP 建议的模型,它与标准方式不同,每行都包含 parent_id

这是建议的表结构:

CREATE TABLE categories (
    id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    parent_id INTEGER(10) DEFAULT NULL,
    lft INTEGER(10) DEFAULT NULL,
    rght INTEGER(10) DEFAULT NULL,
    name VARCHAR(255) DEFAULT '',
    PRIMARY KEY  (id)
);

以前从未使用过这种样式,并且不知道它是如何被搜索的,我想知道我应该索引哪些字段?只是主键就足够了吗,还是我也应该包括lftrght

【问题讨论】:

    标签: sql database tree mptt


    【解决方案1】:

    您将始终使用左列,但我经常需要查找所有叶节点。

    WHERE lft = (rgt -1)
    

    所以我通常只用 lft, rgt 对创建一个索引。

    【讨论】:

    • 这个。大多数树的读取量比写入量多得多,因此在左侧和右侧有一个两列索引(不是 2 个单独的索引)很棒。此外,如果您在同一张表中存储多棵树,例如按用户分组,使其成为grouping_id,左,右的三列索引。
    【解决方案2】:

    我通常只索引左列。我通常使用 mysql,它只允许执行计划中的每个表有一个索引用户,左侧的索引有助于我为 MPTT 表编写的每个查询,并且在该索引中包含右侧的好处是最小的。

    简而言之,根据我的经验,左侧的单个索引是插入/更新速度和几乎每个用例的选择速度之间的最佳平衡。

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2010-12-25
      • 2014-02-28
      • 2010-12-24
      • 1970-01-01
      相关资源
      最近更新 更多