1

私は、imhoがうまく設計されていないデータベースを使用していますが、それを理解していないのは私だけかもしれません。とにかく、私は正しい情報を引き出すクエリを持っていますが、それは私のphpスクリプトを本当に遅くしています。誰かがこれを見て、この深さまでクエリをネストするのが悪いかどうか、そして以下のsqlステートメントに示されている関係からクエリを単純化する方法があるかどうかを知らせてくれることを望んでいました。

SELECT name 
FROM groups 
WHERE id = (SELECT DISTINCT immediateparentid 
            FROM cachedgroupmembers 
            WHERE groupid = (SELECT  g.id AS AdminCc
                             FROM Tickets t, groups g  
                             WHERE t.Id = 124 AND t.id = g.instance AND g.type = 'AdminCc')
                             AND immediateparentid <> (SELECT  g.id AS AdminCc
                                                       FROM Tickets t, groups g  
                                                       WHERE t.Id = 124 AND t.id = g.instance AND g.type = 'AdminCc'))

助けてください

アップデート:

Explainを使用した場合の出力は次のとおりです 説明

テキストを明確にするには、右クリックして[画像を表示]を選択する必要がある場合があります。

4

3 に答える 3

1

私が言えることから、1つの副選択を排除することができます。

SELECT name 
FROM groups 
WHERE id = (
    SELECT DISTINCT immediateparentid 
    FROM cachedgroupmembers 
    WHERE groupid = (
        SELECT g.id 
        FROM Tickets t, groups g
        WHERE t.Id = 124 AND t.id = g.instance AND g.type = 'AdminCc'
    ) AND immediateparentid != groupid
)
于 2013-01-03T15:54:13.043 に答える
1

私はOracle上のPL/SQLにずっと慣れていますが、試してみます。

  1. エイリアスを削除します。ここでは必要ありません。
  2. 句で使用されている列whereにインデックスが付けられていることを確認してください(t.Idおよびg.type)。
  3. MySQLがデフォルトで外部キーにインデックスを付けるかどうかはわかりませんが、チェックする価値があります。

次のようにSQLコードを短縮できます。

SELECT name 
FROM groups 
WHERE id = (
    SELECT DISTINCT immediateparentid 
    FROM cachedgroupmembers 
    WHERE groupid = (
        SELECT g.id 
        FROM Tickets t, groups g
        WHERE t.Id = 124 AND t.id = g.instance AND g.type = 'AdminCc'
   ) AND immediateparentid != groupid
)

また:

 SELECT name 
    FROM groups 
    WHERE id = (
        SELECT DISTINCT immediateparentid 
        FROM cachedgroupmembers 
        WHERE groupid = (
            SELECT g.id 
            FROM Tickets t inner join groups g on t.id = g.instance
            WHERE t.Id = 124 AND g.type = 'AdminCc'
 ) AND immediateparentid != groupid
)
于 2013-01-03T16:36:29.000 に答える
0

チケットテーブルが大きい場合は、2回クエリする代わりに、一時テーブルを検討することができます。

于 2013-01-03T15:48:56.303 に答える