2017-03-01 8 views
0

私は非常に遅く実行される単純なMySQLクエリを持っています。MysQLクエリの最適化、

INSERT INTO People_by_County (City, County, State, score, Month_, person_id) 
SELECT people.City, people.County, people.State, PPL_month.score, PPL_month.Month_, PPL_month.person_id 
FROM PPL_month 
INNER JOIN people ON PPL_month.person_id = people.person_id 

ここでは、人物表では700K行、PPL_month表では2,9M1行です。問題は、別のテーブルで同様のクエリを実行する前に、1つのテーブルに700Kの行が別の400Mlnにあり、クエリが6hで終了したことです。そして、これはほぼ24時間実行されています。なぜそんなに遅いの?その時点で他のクエリは実行されていないので、誰もRAMを使い果たしていません。

あなたはクエリの説明を見ることができます。

enter image description here

+0

'people'テーブルの' person_id'カラムにインデックスがありますか? –

+0

テーブルの構造に関する情報を教えてください。インデックスはありますか?クエリの内容を理解するためにMySQL EXPLAIN関数を使用しようとしましたか? –

+0

構造体、索引をポストし、Explain(選択部分のみ)で実行し、結果もポストします –

答えて

1

まず、このクエリを実行しようとしtable.Then INDEXテーブルPERSON上だけでなく、PPL_Monthを作成

それが実行にかかったどのくらいの時間
SELECT people.City, people.County, people.State, PPL_month.score, PPL_month.Month_, PPL_month.person_id 
FROM PPL_month 
INNER JOIN people ON PPL_month.person_id = people.person_id 

?そのタイミングを書き留めと実行を書き留めます両方のテーブルにインデックスを作成せずに同じクエリを実行するタイミング。 あなたは間違いなくより多くのタイミングを得るでしょう。 間接的には、挿入するデータがフェッチされる速さに依存することを示します。 だから一度フェッチするのが速いのは明らかに挿入が以前のものより速いことです。

これが役に立ちます。

+0

それは魅力のように働いた。ありがとうございました。しかし、私がプロセスを理解するのを助けることができますか?インデックスを作成するには、Peopleテーブルにはあるが、PPL_monthではなく(同じperson_idが複数ある)一意の値しか持たないと思った。このテーブルのインデックス作成はどのように機能しますか?他のすべての同じ値を無視しますか? – Extria

+0

@Extria特定のテーブルに一意の値を持たない場合は、2つ以上の列を組み合わせて一意性を達成することができます。また、実行計画に完全に依存します.Explainを使用してクエリの実行を常に確認することをお勧めします。複数の列の組み合わせでインデックスを作成するだけで続行します。 同じシンテックスは です。tablename(column1、column2);でインデックスidxを作成します。 詳細については、これ以上の説明や説明が必要です。http://mysql.rjweb.org/doc.php/index_cookbook_mysql –