MySqlクエリは遅くなります。 `t.c = t0.cからtblとしてTblに参加`

mysql performance sql

私の上司は、このクエリは「サーバをクラッシュさせる」と私に言った(私が信じているテーブルは何百万もあるから)。 誰もが私に言うことができますなぜ? 多分私はそれをすることになっていると思う方法を教えて? 私は現在これを理解するためにマニュアルを読んでいます。

私が言われたことは、これらの結合は遅くなることです。 それについて何が遅いですか?

"a.A = aa.AとしてASに参加" 「Bに参加中... " "Cに参加してください... " "D ONにt ONとして参加... ""としてDB.Eに参加... " "DB.Fをd ONとして参加... " "DB.Gにg ONとして参加... " "DB.Hとして参加... "

  -1  0


ベストアンサー

いくつか考えています。

  1. データベースが_too_正規化されているという議論があります。 データが頻繁に一緒に使用される場合は、1つの列を複数の表に保持したり、表を結合したりすることをお勧めします。

  2. レポートを生成している場合(非常に多くの列が必要な他の多くの出力を考えることができない場合)、このクエリを実行する必要がある頻度 ETLプロセスを使用して、さまざまなソース表からデータを増分的に構築し、それを大きな照会用の単一の表にロードすることを検討してください。

  3. 適切なインデックスがあることを確認してください。

また、MySQLを使用していると仮定して(質問では具体的には指定されていません)、常に ‘EXPLAIN’ステートメントを使用して、このクエリがどれほど悪いのかを判断できます。

3


JOIN    A AS o ON a.A =aa.A

結合条件がテーブルA( ‘o’と呼ばれる)について言及していないため、これはすぐに赤いフラグを立てます。 それはあなたにあなたが望むものではないすべての行の外積を与えるでしょう。 あなたの結合条件( ON`の後)はつねに結合したテーブル( AS ‘x’`のx)を常に言及するべきです。

1


返される推定行数を確認するには、クエリを解析して(プランは実行しますが、クエリは実行しません)。 結合の結果として多数の行が返される場合、そのようなクエリはデータベースを無効にする可能性があります(JOINSの数は問題ではないと考えられます – ただし、ドキュメントで指定された制限を超える場合を除く) WHERE句に基づくインデックスの使用によって制限されていない限り、JOIN項が膨大な量のデータを返す可能性があるという事実。 もう1つの方法は、メインのSELECT部分​​でインラインSELECTを使用して、オプティマイザがどのクエリプランを作成するかを確認することです。

すなわち

xとしてSELECT *、(b.A = A.Aからbからcol1を選択)
...
から
...

0


タイトルとURLをコピーしました