MYSQLのIN演算子に関する質問です。

インデックスを作成済みのテーブルに対して、多数のIN演算子を利用したクエリーを作成しようと考えています。

SELECT * FROM test WHERE id IN (1,5,10, .... ,9999);

といった形で、多数(500個程度を想定に)のIDを指定する予定です。

お聞きしたい点は、
・クエリーの応答速度は大きく劣化するのでしょうか?
・サーバー機器に求められる要件
・Mysqlの設定上で考慮する点

等々です。
テストデータを投入し、自分で検証してみろ!
という話は重々承知しておりますが、何分機器購入前でしたのでご質問させて頂きました。

知識等お持ちの方がいらっしゃれば、ご意見・アドバイスお願いします。

回答の条件
  • 1人10回まで
  • 登録:2008/02/14 19:33:06
  • 終了:2008/02/15 11:46:20

ベストアンサー

id:nkanai No.1

nkanai回答回数17ベストアンサー獲得回数12008/02/14 21:03:00

ポイント35pt

パフォーマンスの問題云々よりも、IN演算子で500個の値を指定するのは

あまり良いとは思えません。

(デバッグの際に非常に困難になると思います。)

それよりも、Ver.4.1以降でしたらIN演算子の中にサブクエリが使えますので、

テンポラリテーブルをつくり、そこにその500個の値を投入し、

そのテンポラリテーブルから参照するようにSQLを書いたほうがいいと思います。

(デバッグの時にもそのテンポラリテーブルが使えますので、比較的楽だと思います)

例) テンポラリテーブルをtbl_tmpとします。

SELECT * FROM test WHERE id IN (SELECT id FROM tbl_tmp);

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.1.2 比較演算子

id:lg-tsp

ご回答ありがとうございます。

おっしゃるとおり設計がアホなのは存じております。

ただ、テンポラリテーブルを作成するにも、対象となる影響が多すぎて困っており、駄作としてこのような手を考えたし次第です。

2008/02/15 11:33:47

その他の回答(1件)

id:nkanai No.1

nkanai回答回数17ベストアンサー獲得回数12008/02/14 21:03:00ここでベストアンサー

ポイント35pt

パフォーマンスの問題云々よりも、IN演算子で500個の値を指定するのは

あまり良いとは思えません。

(デバッグの際に非常に困難になると思います。)

それよりも、Ver.4.1以降でしたらIN演算子の中にサブクエリが使えますので、

テンポラリテーブルをつくり、そこにその500個の値を投入し、

そのテンポラリテーブルから参照するようにSQLを書いたほうがいいと思います。

(デバッグの時にもそのテンポラリテーブルが使えますので、比較的楽だと思います)

例) テンポラリテーブルをtbl_tmpとします。

SELECT * FROM test WHERE id IN (SELECT id FROM tbl_tmp);

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.1.2 比較演算子

id:lg-tsp

ご回答ありがとうございます。

おっしゃるとおり設計がアホなのは存じております。

ただ、テンポラリテーブルを作成するにも、対象となる影響が多すぎて困っており、駄作としてこのような手を考えたし次第です。

2008/02/15 11:33:47
id:KUROX No.2

KUROX回答回数3542ベストアンサー獲得回数1402008/02/14 21:41:21

ポイント35pt

回答1のやり方が妥当じゃないでしょうか?

http://blog.luckyboy.jp/2007/03/mysql.html

---------

予想では、今回の場合は、IN句でもインデックスが使われると思うので、

「応答速度は大きく劣化」するとは思えません。

id:lg-tsp

ご回答ありがとうございます。やはりテンポラリテーブルが妥当なのですね。

インデックスが使われる/使われないが気になってきたので、やはり検証を実施してみることにしました。

2008/02/15 11:35:34
  • id:b-wind
    おそらくインデックスは使われないでしょうね。
    提示されている情報だけだとあまりよい設計とは思えないので、テーブルの構造を再度見直すことをお勧めしますが。
  • id:lg-tsp
    皆様からご回答いただきインデックス使用有無が気になってきたので、昨夜エイヤとテストデータをこしらえ、検証を実施してみました。せっかくなので、この場を借りて晒せて頂きます。

    ■対象データ件数
    100000件

    ■Mysql タイプ
    MyISAM

    ■検証用クエリー
    select id,keyId,data,timestamp from test where keyId in (多数のkeyIdを指定);

    ■結果:応答速度
    ・KeyIdを1指定
    1msec
    ・KeyIdを20指定
    8msec
    ・KeyIdを50指定
    26msec

    ■結果:インデックスの使用有無
    Explain句の結果
    +----+-------------+----------+-------+---------------+--------+---------+------+------+-------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +----+-------------+----------+-------+---------------+--------+---------+------+------+-------------+
    | 1 | SIMPLE | test | range | KeyId | KeyId | 4 | | 1213 | Using where |
    +----+-------------+----------+-------+---------------+--------+---------+------+------+-------------+

    ■まとめ
    ・検索クエリーにおいてインデックスは使用している
    ・条件が増えるたびに性能は劣化する(当然ですが…)
    ・速度が厳密に求められるシステムではあまり得策では無さそうですね

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません