[解決済み] MySQLの "IN "演算子による(大量の)値に対するパフォーマンス
質問
最近RedisとMongoDBを試しているのですが、RedisとMongoDBに格納された配列に idの を保存する場合が多いようです。この質問では、MySQLの IN 演算子について質問しているからです。
を大量(300~3000)にリストアップするのは、どの程度のパフォーマンスなのか気になりました。 idの を IN 演算子の内部でリストアップする場合、以下のようになります。
SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 3000)
のような単純なものを想像してください。
製品
と
カテゴリ
というテーブルがあり、通常はこれをJOINして
製品
を取得するために
カテゴリ
. 上の例では、Redis のあるカテゴリの下 (
category:4:product_ids
) で、ID 4 のカテゴリからすべての商品 ID を返し、それらを上記の
SELECT
クエリの中の
IN
演算子で囲みます。
これはどの程度のパフォーマンスなのでしょうか?
これは、quot;it depends"という状況なのでしょうか?それとも、具体的な "this is (un)acceptable" や "fast" や "slow" があるのでしょうか?
LIMIT 25
とか、それは役に立たないのでしょうか?
SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 3000)
LIMIT 25
それとも、Redisが返す商品IDの配列を25に制限するためにトリミングして、3000ではなく25のIDだけをクエリに追加して
LIMIT
-を使用してクエリ内部から25個に制限する必要がありますか?
SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 25)
何か提案やフィードバックがあれば、ぜひお願いします。
どのように解決するのですか?
一般的に言えば、もし
IN
リストが大きくなりすぎた場合(「大きくなりすぎた」の定義が不明確で、通常は100以下の領域です)、結合を使用する方が効率的になり、数字を保持するために必要であれば一時テーブルを作成します。
数値が密なセット(ギャップがない - サンプルデータが示唆しています)である場合、以下の方法でさらにうまくいくでしょう。
WHERE id BETWEEN 300 AND 3000
.
しかし、おそらくセットにはギャップがあり、その場合は結局のところ有効な値のリストで行く方がよいかもしれません(ギャップが比較的少ない場合を除き、その場合は
WHERE id BETWEEN 300 AND 3000 AND id NOT BETWEEN 742 AND 836
とか、隙間は何でもいい。
関連
-
MySQL XAが分散型トランザクションを実装する方法を1記事にまとめました。
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] JavaScriptに「NULL合体」演算子はありますか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mysqlインデックスが長すぎる特殊なキーが長すぎる解決策
-
[解決済み】マルチパート識別子をバインドできませんでした。
-
[解決済み] datetimeの挿入時に文字列から日付や時刻を変換すると、変換に失敗する
-
[解決済み】SQLサーバーのテンポラリーテーブルで「すでに名前のついたオブジェクトがあります」エラーが発生する。
-
群関数解の無効な使用
-
MySQLの起動エラー:ERROR 2003 (HY000)。localhost'上のMySQLサーバーに接続できない(10061)
-
CMakeエラー。ソースディレクトリ "/xxx/mysql-5.6.21" に CMakeLists.txt がないようです。
-
[解決済み] なぜ SQLAlchemy の count() は生のクエリよりずっと遅いのでしょうか?
-
[解決済み] KEYキーワードは何を意味するのか?
-
[解決済み] MySQL で特定のカラム名を持つすべてのテーブルを見つけるにはどうすればよいですか?