2016-08-19 12 views
0

データベースへのクエリに大きな問題があります。SQL QUERY - UNION - 複数の同じテーブルに長時間がかかる

私は私の問題について説明しました。私は11の同一のテーブル(バックアップ)を持っています。テーブルはまったく同じで、データを引き出す必要がありますが、非常に時間がかかります。

私はこのようなUNIONクエリを使用しています:

select id, name, ... from table_1 WHERE (...) 
UNION 
select id, name, ... from table_3 WHERE (...) 
UNION 
select id, name, ... from table_2 WHERE (...) 
... ORDER BY created DESC LIMIT 0,50 

しかし、唯一のクエリは約16秒かかります!データベースにはそれほど長い時間を要したデータはあまりありません...

table_1 = 1.3k 
table_2 = 17k 
table_3 = 10k 
table_4 = 10k 
...  = 10k 
table_11= 140K 

このクエリを最適化するのに手伝ってもらえますか?どうもありがとう!

+0

問題は恐らく完全な結果の最後にある順序です。どのくらいのデータが返されますか? –

+0

使用している場合は、内部クエリを使用しないでください。代わりに結合を使用します。 – dhS

答えて

4

最初に、重複を削除するオーバーヘッドが発生しない限り、UNIONを使用しないでください。代わりに、UNION ALLを使用します。

select id, name, ... from table_1 WHERE (...) 
UNION ALL 
select id, name, ... from table_3 WHERE (...) 
UNION ALL 
select id, name, ... from table_2 WHERE (...) 
... 
ORDER BY created DESC 
LIMIT 0, 50; 

あなたはまたWHERE句のための適切なインデックスを使用してパフォーマンスを向上させることができます。しかし、あなたの質問には十分な情報がありません。

実際には、他の最適化は労働組合前に各サブクエリから最初の50行を取ることです。

(select id, name, ... from table_1 WHERE (...) ORDER BY created DESC LIMIT 50) 
UNION ALL 
(select id, name, ... from table_3 WHERE (...) ORDER BY created DESC LIMIT 50) 
UNION ALL 
(select id, name, ... from table_2 WHERE (...) ORDER BY created DESC LIMIT 50) 
... 
ORDER BY created DESC 
LIMIT 0, 50; 

また、これは物事をスピードアップする必要があり、最終的なORDER BYのデータ量を低減します。

+0

ありがとう、それは動作します。 - 0.0205秒から16秒 –

+0

あなたはまだここにいますか?すべてのクエリでこの制限を使用することはできません。私はページャーを使用しており、すべての関連データが必要です。各テーブルから50だけでなく、再び私はクエリを完了するために11秒持っています –

+0

@СергейПетров。 。 。あなたの質問のクエリはただ一つの制限を示しています。 2番目の解決法はページ分割には機能しません。しかし、実際には、これがやりたいことならば、すべてのデータを1つのテーブルに入れる必要があります。これにより、クエリが簡素化され、最適化が容易になります。 –

0

UNIONは、それぞれのテーブルからすべての個別のクエリをすべて取り戻そうとします。重複がないことが分かっている場合は、代わりにUNION ALLを使用できます。

重複が心配な場合は、UNION ALLを使用してすべてを一時表またはサブクエリに選択し、次に戻すすべての列をGROUP BYで削除します。

本当の意味では、ツールバーの見積もり実行計画を見てください。これをクリックすると、クエリのどの部分が長時間かかるのかが表示され、改善が提案されます。

関連する問題