2012-01-03 3 views
2
SELECT value FROM table WHERE id IN ("1","2","3", ... "500000") 

括弧内に約500,000の値を持つ上記のようなクエリを持っています。MySQLクエリ "IN" 500,000レコード

より良い検索方法がありますか?この方法は非常に面倒である/遅いです。

+0

をロードするために繰り返される必要がありません?別のクエリからですか?または、アプリケーションコードのいくつかのリストにありますか? –

+1

これらの500,000アイテムはどこから来たのですか?それらがDB内で発生した場合、あなたは 'join'することができます。ユーザーが500,000の値を入力すると想像するのは難しいです:-) – drdwilcox

+0

MySQLにないデータのリストから。私はこのデータを追加してJOINを行うことができると思います。それはより速いでしょうか? – reefine

答えて

9

500,000の値を別のテーブルに入れて、それに結合します。

SELECT t.value 
    FROM table t 
     INNER JOIN NewTempTable n 
      ON t.id = n.id 
2

あなたはmysqlパケットサイズ制限(16MB)に近づいているので、確かに悪い考えです。

このソースから、あなたは50万IDを持っていますか?それらをデータベースに保存して結合を実行できませんでしたか?

2

あなたが行うことができ、以下:

ステップ01:あなたはlookup_ids

ステップ03にすべての50万値を挿入します:IDのテーブルが

DROP TABLE IF EXISTS lookup_ids; 
CREATE TABLE lookup_ids SELECT id FROM `table` WHERE 1=2; 
ALTER TABLE lookup_ids ADD PRIMARY KEY (id); 

ステップ02作るまともにしますカバーインデックス:table

ALTER TABLE `table` ADD UNIQUE INDEX id_value_ndx (id,value); 

ステップ04:電子

SELECT t.value FROM `table` t INNER JOIN lookup_ids i USING (id); 

または

SELECT t.value FROM `table` t NATURAL JOIN lookup_ids i; 

を登録しようCAVEAT:あなたは、ルックアップIDの異なるセットを持っていない限り、手順1〜3を使用すると、500Kのidを取得しましたか