2

クエリ1:

SELECT  cid,
        dl
FROM    chal
WHERE   cid IN (
        SELECT  cid
        FROM    c_users
        WHERE   uid = 636587
        );

クエリ2:

SELECT  chal.cid AS cid,
        chal.dl  AS dl
FROM    chal,
        c_users
WHERE   uid = 808
        AND    chal.cid = c_users.cid;

cidはchalcidの主キーであり、uidはc_usersでインデックス付けされます。cidは一意ではありません。

上記のクエリのどれが良いですか?

説明は次のように言います

  • クエリ1は、ALLとindex_subqueryの2種類のインデックスを使用します

  • 2つのユーザーに2種類のインデックス、つまりALLとrefをクエリします。

cidはテーブルchalの主キーですが、なぜ両方のクエリがインデックスのタイプとしてALLを言うのでしょうか。

4

4 に答える 4

1

結合やネストされたselectは使用しません。

アプリケーションレベルで2つのSQLを記述します。これは、スケーリングするにつれてはるかに高速になります。

選択は、両方のテーブルの主キーに基づいている必要があります。すなわちcid

于 2010-03-02T05:49:01.470 に答える
1

どちらのクエリが高速になるかを尋ねていると思いますが、経験則として、2 番目のクエリの方が高速です。ただし、行数が少ないテーブルの場合、その違いは重要ではありません。

于 2010-03-02T03:08:53.527 に答える
1

cid は c_users でインデックス化されていますか? そうでない場合は、ここで完全なテーブル スキャン (別名「ALL」) が保証されます。

于 2010-03-01T15:20:45.053 に答える
0

これらのクエリは同一ではありません。

の特定のユーザーに2等しいがある場合、最初のクエリは ごとに 1 つのレコードを返し、2 番目のクエリは 2 つのレコードを返します。cidc_userscid

index_subqueryMySQLでテストされた式をサブクエリにプッシュININTRUE最初の一致で返す最適化です。

最初のクエリは常にchal主要なテーブルとして使用されますが、2 番目のクエリは betweechalc_usersを選択でき、おそらく を選択しますc_users

で複合インデックスを作成する必要がありますc_users (uid, cid)

于 2010-03-01T15:21:05.310 に答える