0

ユーザー情報を含むusersテーブルと、現在のユーザーに関連するユーザーを表示する関連テーブルがあります。

関連するユーザーをユーザーID「25」に取得するには、私のクエリは次のようになります。

SELECT
  id
FROM users u
  INNER JOIN (SELECT
                primary_id,
                secondary_id
              FROM users_rel
              WHERE primary_id = '25'
                   OR secondary_id = '25') temp
    ON (u.id = temp.primary_id
         OR u.id = temp.secondary_id)
WHERE u.id != '25'

ここでの問題は、users_relテーブル内でユーザーIDがプライマリ側またはセカンダリ側のいずれかになり得ることです。すでに600万レコードで行われているので、変更するように言わないでください。変更できません。このクエリは、テーブル内およびテーブル内の4000レコードを使用して実行するのに2〜5分かかります。user_rel629241users

    user_rel TABLE
.--------------------------------.
|    id         |  (VARCHAR,36 ) |   
|   primary_id  |  (VARCHAR,36)  |
|  secondary_id |  (VARCHAR,36)  |
|    del        |  (TINYINT,1)   |
|.______________________________.|

インデックスはとの組み合わせとして定義されprimary_idますsecondary_id

4

1 に答える 1

1

すでに600万レコードで行われているので変更できません

ペアのハードコアを育ててください-テーブルに比較的少量のデータがすでにあるということは、悪いデザインを修正しない理由にはなりません。

テーブルとExplainプランの両方の正確な構造(つまり、create tableステートメント)を投稿すると役立ちます。

テーブルを結合するだけでなく、サブクエリを使用するのはなぜですか?もう一度やり直すと、最適化を開始できるものが得られます。

SELECT u.id
FROM users u
INNER JOIN users_rel r
    ON 25 in (primary_id, secondary_id)
    AND (u.id = r.primary_id 
        OR u.id=r.secondary_id)
WHERE u.id != '25';

これで同じ結果が得られるはずです。速いかどうか……わかりません。

インデックスは、primary_idとsecondary_idの組み合わせとして定義されます

なんで?このクエリではあまり役に立ちません。primary_idに1つ、secondary_idに1つ、2つのインデックスが必要です。

于 2013-03-27T09:24:08.647 に答える