0

MySQL データベースに 2 つのテーブルがあります。1 つのテーブルにはデフォルト値が含まれ、もう 1 つのテーブルにはオーバーライド値と追加が含まれています。2 つの別々の作業 SQL ステートメントを作成して、両方からすべての要素を選択し、オーバーライドがある場合はデフォルト テーブルの値を置き換えます。

SELECT
    d.id AS did, IFNULL(i.id, d.id) AS id, d.parent_id AS parent_id,
    IFNULL(i.content, d.content) AS content, d.order_id AS ord
  FROM cci d 
    LEFT JOIN instructions i ON d.order_id = i.order_id
      AND i.parent_id = d.parent_id
      AND i.specification_id = 'SOME ID'
  WHERE d.parent_id = 'SOME PARENT' AND d.specification_id = '1'
UNION ALL SELECT
    i.id AS did, i.id AS id, i.parent_id AS parent_id,
    i.content AS content, i.order_id AS ord
  FROM instructions i
  WHERE i.parent_id = 'SOME PARENT' 
    AND i.specification_id = 'SOME ID' 
    AND NOT EXISTS (SELECT 1 FROM cci d WHERE d.order_id = i.order_id AND d.parent_id = i.parent_id)

2 つの部分は個別には意図したとおりに正常に動作しますが、それらを組み合わせると、MySQL が 90% の CPU に急上昇し、フリーズします。明らかに、何かがうまく機能していません。何がそのようなフリーズを引き起こしているのでしょうか、それとも私の声明に何か問題がありますか?

ありがとう

編集:

EXPLAIN の出力は次のとおりです。

id  | select_type          | table      | type | possible_keys | key  | key_len | ref  | rows | Extra
————————————————————————————————————————————————————————————————————————————————————————————————————————
1   | PRIMARY              | d          | ALL  | NULL          | NULL | NULL    | NULL | 105  | Using where
1   | PRIMARY              | i          | ALL  | NULL          | NULL | NULL    | NULL | 4    |  
2   | UNION                | i          | ALL  | NULL          | NULL | NULL    | NULL | 4    | Using where
3   | DEPENDENT SUBQUERY   | d          | ALL  | NULL          | NULL | NULL    | NULL | 105  | Using where
NULL| UNION RESULT         | <union1,2> | ALL  | NULL          | NULL | NULL    | NULL | NULL |  
4

1 に答える 1

0

問題は、最適化されていない結合戦略に切り替えているオプティマイザーです。

問題は、おそらくUNIONALLとの関連で「含まれていない」ことです。

クエリを書き直せると思います。ここにスタートがあります:

SELECT (case when d.specification_id = '1' then d.id else i.id) AS did,
       ...
FROM cci d LEFT JOIN
     instructions i
     ON d.order_id = i.order_id  AND
        i.parent_id = d.parent_id AND
        i.specification_id = 'SOME ID' left outer join
     cci parent
     on d.parent_id = parent.parent_id
WHERE d.parent_id = 'SOME PARENT' AND d.specification_id in ('1', 'SOME ID')

または、一時テーブルを使用することでも問題を解決できます。

于 2012-05-10T15:15:41.973 に答える