3

我只是在使用修改的预排序树遍历 (MPTT) 构建一个表来存储分层数据——你知道的:每个节点都存储leftrightID 以查找其后代。我正在使用 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)
);

以前从未使用过这种风格,也不知道它是如何被搜索的,我想知道我应该索引哪些字段?只是主键就足够了,还是我也应该包括lft在内rght

4

2 回答 2

4

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

WHERE lft = (rgt -1)

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

于 2010-02-07T20:46:46.180 回答
1

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

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

于 2009-10-21T01:57:35.863 回答