2016-10-28 6 views
1

私のクエリでは、カンマ区切りのIDを持つすべてのレコードを以下で見つけなければなりません。 MySQL INオペレータ代替

2,20,44,66,68,85,90,101,102,103,125,168 

は、だから私は、タスク

SELECT item_id, 
     item_name 
FROM `items` 
WHERE `item_id` IN (2, 20, 44, 66, 
         68, 85, 90, 101, 
         102, 103, 125, 168) 

については、以下のクエリを書いたしかし、問題はカンマがIDリストを離れたときに大きくなる大きなクエリの実行時間があるということです。私の仕事を達成する他の方法はありますか?

DESCRIBEテーブルクエリ後のMy Table構造体は以下のとおりです。確認してください

Field Type Null Key Default Extra 
asheet_id int(11) unsigned NO PRI NULL auto_increment 
asheet_staff_id int(11) unsigned NO  NULL  
asheet_exam_number int(11) NO  NULL  
+3

正しいインデックスは問題を解決します(おそらく) – baao

+0

item_idは主キーですか? - そうでない場合:ALTER TABLE 'items' ADD INDEX item_id_index(' item_id') – num8er

+0

もっと良い方法がありますか? item_idのインデックスを作成してパフォーマンスを改善する – Laazo

答えて

0

item_idはプライマリキーですか?

は実行しますので、あなたのサーバーのメモリ、クエリキャッシュは、クエリの同時実行、ネットワーク/ソケット接続となどの要因を調査

1)YES場合

DESCRIBE items; 

と入れて結果を疑問視します。おそらく遅い部分はあなたのクエリではなく、あなたのアプリの別の部分にありますか?あなたがそれをどうチェックするか、質問/コメントで説明してください。 my.cnfを見てください。あなたがmysqlのパフォーマンスを調整するのに役立つ多くのパラメータがあります。 ALTER TABLE items ADD INDEX item_id_index (item_id)

IF:NOはそうインデックスを追加

2)場合はあなたのitems表には、それがMyISAMにエンジンを変更する方が良いでしょうに、それはSELECTのために高速です、としばしばUPDATEクエリを取得

を照会しません。

また、次の手法を試してみましょう:

1)UNION SELECT PKはSELECT ... LIMIT 1として動作します:

SELECT item_id, item_name FROM items WHERE item_id = 2 
UNION ALL 
SELECT item_id, item_name FROM items WHERE item_id = 20 
UNION ALL 
. 
. 
UNION ALL 
SELECT item_id, item_name FROM items WHERE item_id = 168 

2)ビューを作成し、それまでお問い合わせください:あなたのデシベルの場合

CREATE OR REPLACE VIEW vw_items AS 
SELECT item_id, item_name FROM items; 

SELECT * FROM vw_items WHERE item_id IN (...); 

もが多くの要求を持っており、items表がある場合は、アップデートを持っていますクエリーがデータベースへのクエリーをキャッシュしようとしましたmemcacheredis

ps JOINまたはsub query操作を実行すると、いずれの場合もitem_idフィールドで同じインデックスが使用されるため、パフォーマンスが向上しません。

もう一つの方法は、 Temporary Tableを作成し、それらのデータをそのテーブルを記入して、このアプローチは次のようになり、そのテーブルに参加

SELECT i.item_id, i.item_name 
FROM `items` i 
JOIN test t ON i.item_id = t.Id; 

を実行するとJOIN

よう
create temporary table test(Id int); 

insert into test 
select 2 
union 
select 99 from dual; 

を行うことであろう

+0

まず、あなたのデータはどのように配列(2,20 、44,66,68,85,90,101,102,103,125,168)。データベースに配列の値を格納し、アイテムテーブルを持つロジックにいくつかを作ることができれば、結合操作を使うことができます。 –

+0

@bikramkcは私を笑わせません。それは最大の有効性で動作し、必要なものを見つけるでしょう。 JOINであっても 'item_id'フィールドで定義されているものと同じインデックスを使用するため、操作のパフォーマンスが向上しません。 – num8er

0

大きいINリストよりも優れています。これは、リスト内のリストが内部的に連結されてORの状態にチェーンされ、さらにすべてのRDBMSがINMySQLについてはわかりませんが、NETEZZAには5000要素程度の制限があります)。

代わりにJOINを実行すると、効率的な実行計画が生成されます。 SQL Serverならば、あなたも同様に使用することができますTable Type Variable

+0

私は自分のテーブルのすべてのレコードを一時テーブルに含める必要がありますか?そうであれば、内部結合はアイテムテーブルからすべてのレコードも返します。 – Alchemist