0

MySQL でストアド プロシージャを作成しようとしています。複雑な理由から、オブジェクト ID を調べるために多数の結合を含む集計クエリを作成し、さらに結合 (同じテーブルを含む) を使用して別のクエリを実行してデータを取得します。

したがって、次のようなものです。

CREATE TEMPORARY TABLE ids ENGINE=MEMORY
SELECT MAX(child.id)
    FROM parent 
    JOIN child ON child.parent_id = parent.id
    WHERE
    GROUP BY child.parent_id;

SELECT *
    # MUST SELECT STUFF FROM PARENT, CHILD, AND STUFF JOINED ON CHILD
    FROM child 
    JOIN parent ON parent.id = child.parent_id
    # A BUNCH MORE JOINS HERE
    WHERE child.id IN (SELECT * FROM ids);

DROP TEMPORARY TABLE  IF EXISTS ids;

ここで、最初の選択に 0.000 秒かかることに気付きました。(SELECT * FROM ids) を (1435,2352,43653,34534,...) のような定数リストに置き換えると、2 番目の選択にも 0.000 秒かかります。

ただし、一時テーブルの作成で両方を実行すると、0.6 秒かかります。0.o WTH?

私の質問は、この一時テーブルの作成をスキップして、ID のリストを渡す方法です。

また、最初の選択全体をサブ選択として 2 番目の選択に移動すると、手順全体に時間がかかります。待つことをあきらめる1分以上。

4

1 に答える 1

1

これを試してください:

SELECT *
FROM (
  SELECT parent.*, MAX(child.id) as max_id
  FROM parent 
  JOIN  child ON child.parent_id = parent.id
  WHERE -- some where cond
  GROUP BY parent.id
) as parents
JOIN  child ON child.id = parents.max_id
-- other joins

パフォーマンス結果を表示します。

于 2012-11-30T21:27:52.613 に答える