2

テーブルには約 800 万行あります。X には一意でないインデックスがあります。

インデックスを表示すると、「seq_in_index」が 1、照合 A、カーディナリティ 7850780、sub_part NULL、packed NULL、index_type BTREE のキー名 X に一意でないインデックスがテーブルにあることがわかります。

それでも、このクエリの実行には 5 秒かかる場合があります。int のリストは別のシステムからのものであり、それらをテーブルに格納することは許可されていません。なぜなら、それらはソーシャル ネットワーク上の友情を表しているからです。

大規模な IN ステートメントよりも高速な方法はありますか?

4

3 に答える 3

12

ID のリストを一時テーブル (MySql がサポートしている場合は table-var) に変換して結合できます。

テーブルはクエリの間だけ存続するため、実際にはテーブルに何も格納していません。

于 2009-03-08T13:31:56.150 に答える
5

それらを一時テーブルに保存してみてください。このテーブルはデータベースに永続的に格納されることはなく、インデックスを並行して処理でき、インデックス ルックアップを実行する必要がないため、結果の結合 (一時テーブルにもインデックスを作成すると仮定) は高速になると思います。各 int に対して IN 句。もちろん、MySQL は IN 句を最適化し、インデックスを使用することがわかっている場合は同じことを行う可能性があるため、実際には何も得られない可能性があります。私は試してみて、それがより速いかどうかを確認します。

于 2009-03-08T13:35:17.063 に答える
4

他の人が示唆しているように、一時テーブルが最も適切なソリューションです。

ただし、カーディナリティと一時テーブル/in() 条件の行数によっては、オプティマイザがシーケンシャル スキャンの使用に頼る場合があることに注意してください。インデックス。

この時点で、リレーションシップの再設計を検討することが適切な場合があります。

于 2009-03-08T13:41:16.750 に答える