2016-04-11 21 views
1

私は1500万〜2,000万行のMySqlテーブルを持っています。私は過去に100%以上の性能向上のためにデータ分割を使用しました。しかし、今、次のクエリを実行すると、クエルが実行されるまでに60秒以上かかりました。説明でMySQLクエリが非常に遅い

select state, gender, count(*) from big_data where gender in ('Sugar Daddy','Sugar Baby') group by state, gender 

結果

[SQL]select state, gender, count(*) from big_data where gender in ('Sugar Daddy','Sugar Baby') group by state, gender 

Affected rows: 0 
Time: 59.390s 

私が見つかりました:時間の 99%が一時テーブルにコピー過ごしました!このクエリのパフォーマンスを向上させるにはどうすればよいですか?

enter image description here enter image description here

スキーマ&説明:

enter image description here

enter image description here

+0

複数の評価を行う必要があるため、必ずINを使用するのは遅くなります。文字列型の列の場合。他の方法で進むことはできませんか?あなたのテーブルにインデックスが定義されていますか? –

+1

インデックス(gender、state)が必要です。テーブルスキーマとEXPLAIN結果を投稿してください。 –

+0

うん、インデックスが定義されています。 –

答えて

0

INが本当に言い換えORリストであるので、あなたは、ANを利用する代わりに、UNIONを試してみてくださいインデックスはgenderです。そのように:それはWHERE句で使用できるように

select state, gender, count(*) 
from big_data 
where gender = 'Sugar Daddy' 
group by state 
UNION 
select state, gender, count(*) 
from big_data 
where gender = 'Sugar Baby' 
group by state 
order by state, gender 
0

あなたは、gender列に少なくともインデックスを必要としています。しかし、WHERE条件に一致する行が多すぎる場合は、GROUP BYのソートも高価になる可能性があります。そのため、(性別、州)のインデックスはより良くなり、クエリはそのインデックスのみを操作します。 stateは既にPKの一部であるため、PKは常にInnoDB内のインデックスの一部であるため、そのインデックスはさらに多くの領域を占有しません。

Additonaly gendersテーブル(gender_id、gender_name)を作成し、大きなテーブルでgenders.gender_idを参照する外部キーを使用することをお勧めします。あなたがテーブルとインデックスを小さく保つこのwhay。

関連する問題