3

Modified Pre-order Tree Traversal (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

私は通常、左の列だけにインデックスを付けます。私は通常、実行計画のテーブルごとに 1 つのインデックス ユーザーのみを許可する mysql を使用します。左側のインデックスは、MPTT テーブルに対してこれまでに作成したすべてのクエリに役立ち、そのインデックスに右側を含めることの利点は最小限です。

要するに、私の経験では、左側の単一のインデックスは、ほぼすべてのユースケースで挿入/更新速度と選択速度の最適なバランスです。

于 2009-10-21T01:57:35.863 に答える