web-dev-qa-db-ja.com

SQLでIDで複数の行を選択する最良の方法は何ですか?

複数のレコードを選択する必要があります

私が使う

SELECT *
FROM `table`
WHERE `ID` =5623
   OR `ID` =5625
   OR `ID` =5628
   OR `ID` =5621

このクエリは、phpで毎秒4回実行されます

これのためのより良い、より速い方法はありますか?

23
lashX
SELECT *
FROM `table`
where ID in (5263, 5625, 5628, 5621) 

おそらくより良いですが、速くはありません。

58
anthares

人々が言っ​​たことに加えて(どこにあるか):

1)IDがたくさんある場合は、IDを一時テーブルに貼り付け、その一時テーブルとの結合を実行することをお勧めします

2)テーブルにidのインデックスがあることを確認します

3)データのリアルタイム性が重要でない場合は、クエリ結果をアプリケーション側のキャッシュに配置します

7
DVK
SELECT *
FROM `table`
WHERE `ID` in (5623, 5625, 5628, 5621)

これについてさらに調査していると、興味深いブログに出くわしました post セットを使用して、IDのリストをCommon Table Expression(CTE)に作成し、結合することで、In句からSQLパフォーマンスを高速化する方法を説明していますその上で。

したがって、PHP以下に相当するものをコーディングして、最大のパフォーマンスを得ることができます。

DECLARE  @idList varchar(256) 
SET @idList = '5623, 5625, 5628, 5621'

;with ids (id) as
(
    SELECT value FROM UTILfn_Split(@idList,',')
)

SELECT     t.* 
FROM     table as t
INNER JOIN    ids
ON        t.ID = ids.id
5
Nicholas Murray
SELECT *
FROM `table`
WHERE `ID` IN (5623, 5625, 5628, 5621)

しかし、1秒あたり4回は大量です。 データベースへのアクセスが少ない別のアプローチについて考えます。

2
Felix Kling

もし、するなら

SELECT *
FROM `table`
WHERE `ID` IN (5623, 5625, 5628, 5621)

IDの数が大きくなりすぎない限り、問題はありません。 IDのインデックスを作成して、クエリの実行速度を上げることをお勧めします。

また、ロジックを変更することを検討してください。そうすれば、それほど多くのIDを渡す必要がなくなります。

1
Marcos Placona