2017-10-31 8 views
0

問題はこのようになります。MySQLの一時テーブルvsどこの部分で

テーブルUserから*を取得する必要があります。ここで、カラムphoneNumberphoneNumberArrayです。約300〜1000の電話番号があります。テーブルUserにはphoneNumberにインデックスがあり、数百万の行を含むことができます。

一時テーブルUserphoneNumbersを作成し、すべての電話番号を挿入し、JOINを行うか、単純なWHERE INを使用し、1000の電話番号の配列を渡す方が良いでしょうか?

+0

実行計画と統計を見てみると、私はテンポラリテーブルを使用する方がビルのコストが高くなり、テーブルにデータを入れることになると思います。 – dbajtr

+0

クエリ、データ、またはその両方を表示できますか? –

+0

電話番号の一時テーブルを作成するのは、問い合わせ頻度が低く、電話番号リストが静的な場合に最適です。 電話番号リストが動的な場合は、WHERE INを使用してテーブルの作成と削除時間を短縮する方が良いです。 – BRjava

答えて

1

私は最初の方法がより読みやすくメンテナンスのために良いと思います。

一時テーブルから永続テーブルに切り替える場合は、より簡単になります。パフォーマンスについて

は、すでにtopic about itがあります:。

は、私はあなたがWHERE句でそれを行う場合、プランナは、より効率的であるルート(すなわち 選択されている疑いがあるいずれかの指標に基づく、または事前 フィルタリングされたデータセット)。 (付属列と 複数列インデックスがまだのPostgresでサポートされているかどうかわからない)

あなたはおそらく2列に索引を追加することを ことで(そうでない場合は速い)参加作品を早く作ることができます。

+0

あなたの答えに感謝します。トピックについての重大な投稿がありますが、エンジンが最適化を行うかどうかは常に終わります。多くの回答が年を重ねるにつれて、2017年にエンジンが何をしているのかを知ることは難しいです。 –

+1

私は非常に大量のデータ(数十億)を扱っています。だから、わかりやすい言葉であなたが好む方法が正しいと思います。 –

1

これは興味深い質問です。 2番目のメソッドの使用には、配列に値を入れることについて多くの議論があります。

一時テーブルを使用することは不合理な選択ではありませんが、アプリケーションに重大な複雑さを追加します。データベースに読み込みと書き込みのオーバーヘッドが追加されます。アプリケーションはテーブルを作成して読み込む必要があります(データベースはそれを削除します)。

このオプションが必要と思われる場合は、電話番号が表の主キーであることを確認してください。パフォーマンスに最適です。

特にINを使用することは合理的な選択です。 MySQL注文定数INは、一致する値のバイナリ検索をリストして使用します。これはフルテーブルスキャンで最も効果的です。その大きな一覧では、フルテーブルスキャンが最も効率的な方法である可能性があります。

個人的には、INのリストから始めます。 INリストが1,000要素のクエリを生成するのは、3要素のリストと同じコード複雑さです。それがあなたのニーズを満たしていない場合は、一時テーブルを使用してパフォーマンスを試してみてください。それがはるかにうまくいく場合は、そのアプローチに進みます。

関連する問題