0

PHP のこのクエリで問題が発生しています。非常に遅いため、実行後数分間サーバーに接続できません。メインクエリから個別のサブクエリを削除してきましたが、最後の内部クエリを削除した後、完全にスムーズに機能することがわかりました。

テーブル「u」には 30.000 行、テーブル「u_r」には約 17.000、テーブル「u_s」には約 13.000、テーブル「s」には約 100 の行があります。条件に一致する同じ「id_u」。

十分な情報を提供したことを願っています。他に何か知りたいことがあれば、コメントでお気軽にお尋ねください。

SELECT DISTINCT id_p
FROM u
WHERE
    '$x' IN(
        SELECT id_p
        FROM u_p
        WHERE id_u=u.id_u
    )
    AND
    (
        '$y' IN (
            SELECT id_r
            FROM u_r
            WHERE id_u=u.id_u
        )
        OR
        '$y' IN (
            SELECT DISTINCT id_r
            FROM s
            WHERE id_s IN (
                SELECT id_s //without this query, everything works fine
                FROM u_s
                WHERE id_u=u.id_u
            )
        )
    )
4

2 に答える 2

1

私はあなたが変えることができると思います:

SELECT DISTINCT id_r 
        FROM s 
        WHERE id_s IN ( 
            SELECT id_s //without this query, everything works fine 
                FROM u_s 
                WHERE id_u=u.id_u 

SELECT s.id_s
        FROM u_s 
             INNER JOIN s ON u_s=id_u=u.id_u
        WHERE u_s.id_u = u.id_u
        GROUP BY s.id_r

構造物に頭を巻き付けようとしているため、テストされていません。

また、インデックスを確認することを忘れないでください。大まかな目安として、「WHERE」にあるものと「ON」にあるものをインデックスに登録する必要があります。

u_p.id_u
u_r.id_u
u_s.id_u
s.id_s
于 2012-09-04T01:13:05.663 に答える
0

これが同じ結果を生成することをテストしてください - はるかに速いはずです。

  1. IN ステートメントを内部結合に置き換えます。クエリ オプティマイザーがこの方法で最適化する機会が増える
  2. ORステートメントを削除します-UNIONを使用してこれを行いました。必要に応じて、代わりに LEFT JOIN を使用して OR を削除できると思います。
  3. これをテストする必要があります。サンプル データはありません。
select distinct id_p
from u
inner join u_p
on u.id_u = u_p.id_u
and u_p.id_u = '$x'
inner join
(
  select id_r.id_u
  from u_r
  where id_r = '$y'   
  union
  select id_r
  from s
  inner join u_s
  on s.id_u = u_s.id_u
  where id_r = '$y'
) as subq
on u.id_u = subq.id_u
于 2012-09-04T02:14:25.257 に答える