3
mysql> desc ads_common;
+--------------+-----------------------+------+--- --+--------------------------------+----------------+
| | フィールド | フィールド タイプ | ヌル | キー | キー | デフォルト | エクストラ |
+--------------+-----------------------+------+--- --+--------------------------------+----------------+
| | ads_id | bigint(20) 符号なし | いいえ | PRI | ヌル | auto_increment |
| | ユーザー ID | bigint(20) 符号なし | いいえ | マル | ヌル | | |
| | ウェブサイトの種類 | enum('グループ','ユーザー') | いいえ | マル | ヌル | | |
| | website_id | bigint(20) 符号なし | いいえ | | | ヌル | | |
| | サブグループ ID | bigint(20) 符号なし | いいえ | | | ヌル | | |
| | country_id | smallint(5) 符号なし | いいえ | マル | ヌル | | |
| | type_id | int(10) 符号なし | いいえ | マル | ヌル | | |
| | 電話 | int(11) | いいえ | | | ヌル | | |
| | 携帯電話 | int(10) 符号なし | いいえ | | | ヌル | | |
| | cat_id | int(10) 符号なし | いいえ | マル | ヌル | | |
| | ブランド ID | mediumint(8) 符号なし | いいえ | マル | ヌル | | |
| | モデル ID | mediumint(8) 符号なし | いいえ | マル | ヌル | | |
| | エリア ID | int(10) 符号なし | いいえ | マル | ヌル | | |
| | is_offering | tinyint(1) | いいえ | マル | 1 | | |
| | 価格 | int(11) | いいえ | マル | ヌル | | |
| | item_status | tinyint(3) 符号なし | いいえ | マル | ヌル | | |
| | add_time | タイムスタンプ | いいえ | マル | CURRENT_TIMESTAMP | | |
| | 質問番号 | smallint(5) 符号なし | いいえ | | | ヌル | | |
| | is_stop | tinyint(1) | いいえ | マル | 0 | | |
+--------------+-----------------------+------+--- --+--------------------------------+----------------+

type_id,country_id,is_top 複数列インデックスと type_id 単一インデックスがあります。約 180245 行の ads_common テーブル。

1.最初のクエリ コマンド

SELECT c.ads_id FROM ads_common AS c                                
WHERE c.type_id IN (185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241) 
AND c.country_id=226 AND is_stop=0  ORDER BY c.ads_id DESC

180,047 行が見つかりました。0.0026 秒かかりました

2. 2 番目のクエリ コマンド

SELECT c.ads_id FROM ads_common AS c
WHERE c.type_id=187 
AND c.country_id =226 AND is_stop=0 ORDER BY c.ads_id DESC

180,044 行が見つかりました。これには 0.2335 秒かかりました

異なるコマンドは「type_id IN (..187..)」と「type_id=187」の 2 つだけですが、なぜコマンド 2 は 1 より遅いのですか?

コマンド 2 を次のように変更した場合:

SELECT c.ads_id FROM ads_common AS c
WHERE c.type_id IN (185, 187)
AND c.country_id =226 AND is_stop =0 ORDER BY c.ads_id DESC

180,044 行が見つかりました。これには 0.0007 秒かかりました。こちらの方が高速です。

SELECT c.ads_id FROM ads_common AS c
WHERE c.type_id IN (187)
AND c.country_id =226 AND is_stop =0 ORDER BY c.ads_id DESC

180,044 行が見つかりました。これには 0.2267 秒かかりました。こちらの方が高速です。

すべてのコマンドはほぼ同じ行を返します。

4

1 に答える 1

0

1.コマンド

SELECT c.ads_id
FROM ads_common AS c                                
WHERE c.type_id=187
AND c.country_id=226 AND is_stop=0  ORDER BY c.ads_id DESC

(合計 180,044、クエリにかかった時間は 0.2364 秒)

    説明

    ID:1
    select_type: シンプル
    表:c
    タイプ:index_merge
    possible_keys:type_id,country_id,is_stop
    キー:is_stop,country_id,type_id
    key_len:1,2,4
    参照:ヌル
    行:22530  
    おまけ: intersect(is_stop,country_id,type_id); の使用 使用中...

2.コマンド

SELECT c.ads_id
FROM ads_common AS c                                
WHERE c.type_id IN (0,187)
AND c.country_id=226 AND is_stop=0  ORDER BY c.ads_id DESC

合計 180,044 件、クエリにかかった時間は 0.0010 秒

    説明

    ID:1
    select_type: シンプル
    表:c
    タイプ:ref
    possible_keys:type_id,country_id,is_stop
    キー:country_id
    key_len:2
    ref:定数
    行:90122
    おまけ:whereの使い方

非常に興味深い、ほぼ同じコマンドですが、異なるパフォーマンスが得られます。

最後に、mysqlを再起動してコマンドを実行し、コマンドを実行する前に毎回再起動するので、キャッシュは問題ありません。

コマンド 1 は 1.2358 秒かかりました "c.type_id=187"
コマンド2の「c.type_id IN (0, 187)」は0.05秒かかりましたが、0を任意の数字に置き換えても結果は同じです。

はい、「c.type_id in (187)」は「c.type_id=187」と同じパフォーマンスですが、「c.type_id in (187,0)」または「c.type_id in (0,187)」はパフォーマンスが向上します。

于 2013-04-02T07:27:36.157 に答える