0

読み込みに約40〜50秒かかるこのクエリがあります

SELECT
  members.latitude,
  members.longitude,
  members.mem_id
FROM members
WHERE profile_type != "C"
    AND (gender = 'm'
          OR gender = 'f')
    AND members.mem_id IN(SELECT DISTINCT
                            n2.mem_id
                          FROM network n1,
                            network n2
                          WHERE n1.frd_id = n2.mem_id
                              AND n1.mem_id = '48'
                              AND n2.frd_id = '48')
ORDER BY profilenam

ユーザーの友達を含むネットワークテーブルがあります

助けてください..

4

3 に答える 3

3

使用されるサブクエリが派生テーブルを使用してサブクエリなしで試してみるため、これは遅いです。

SELECT latitude, longitude, a.mem_id
FROM members a
     INNER JOIN (SELECT DISTINCT n2.mem_id AS mem_id
                 FROM network n1,
                      network n2
                 WHERE n1.frd_id = n2.mem_id
                       AND n1.mem_id = '48'
                       AND n2.frd_id = '48'
                ) b
                ON a.mem_id = b.mem_id
WHERE profile_type != "C"
      AND (gender = 'm'
           OR gender = 'f')
ORDER BY profilenam;

また、テーブルに適切なインデックスを追加EXPLAIN EXTENDEDし、インデックスの使用状況を確認するために使用します。

ALTER TABLE network ADD KEY ix1(mem_id);
ALTER TABLE network ADD KEY ix1(frd_id);
于 2012-07-25T11:24:44.227 に答える
0

IN句は、結果セットが小さい場合にのみ本当に適しています。より大きな結果セットについては、クエリを書き直すことを検討してください。フィルタ(IN句が生成する)は、コストのかかるデータベース操作です。

于 2012-07-25T11:26:33.640 に答える
0

IN句をEXISTSに置き換えます。

INコレクションで許可されるアイテムは1000個のみです

in(items_num = 1000)

于 2012-07-25T11:29:32.297 に答える