2

「隣接リスト」メソッドを使用してツリー階層を定義するMySQLのテーブルを使用していますが、これは私の目的には問題ありません。

(高速)クエリを使用して、すべての子の最大値を計算する必要があります

SELECT MAX(N.someValue) AS rate
FROM `nodes` N
WHERE N.parent = <some node id>;

時々、私は幸運ではなく、子の子孫で作業する必要があります (定義されており、常にそのツリーのブランチにある葉ノードを参照しています)。

SELECT MAX(N.someValue) AS rate
FROM `nodes` N
WHERE N.id IN (SELECT N2.descendant FROM `nodes` N2 WHERE N2.parent = <some node id>);

この 2 番目のクエリは非常に低速です。特定の親の子の数は非常に少なく、10 を超えることはめったになく、20 を超えることもありません。EXPLAIN はサブクエリが依存していると言っていますが、私の目には相関サブクエリのようには見えません。MySQL 5.1 でテストしています。nodes.idが主キーで、 に BTREE インデックスがありnodes.parentます。このクエリの速度を向上させる方法はありますか?

4

1 に答える 1

3

このクエリが遅い理由を具体的に説明するものは何もありませんが、サブクエリの代わりに JOIN を使用して再構築できることはわかります。このようなもの (テーブルのエイリアスを逆にしたのは、それが私の脳の仕組みだからです):

SELECT MAX(n2.someValue) AS `rate`
FROM `nodes` n1
JOIN `nodes` n2 ON n1.descendant = n2.id
WHERE n1.parent = '<some static id>'

サンプルクエリが遅い理由はわかりませんが、適切なフィールドがインデックス化されている限り、もちろんフェッチされる行数に応じて、この構造がパフォーマンスの問題を引き起こすことはありません。

于 2015-05-03T00:42:20.203 に答える