MySQL查询非常慢

时间:2016-04-11 17:36:06

标签: mysql temp-tables bigdata

我有一个MySql表,其行数在1500万到2000万之间。我过去曾使用数据分区来提高性能100%以上。但是,现在,当我运行以下查询时,查询执行时间超过60秒。

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

2 个答案:

答案 0 :(得分:0)

由于IN实际上是一个释义OR列表,您可以尝试使用UNION来利用gender上的索引;像这样:

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

答案 1 :(得分:0)

您至少需要gender列的索引,因此可以将其用于WHERE子句。但是如果有太多行匹配WHERE条件,GROUP BY的排序可能也很昂贵。因此,(性别,州)的索引会更好,您的查询只会运行该索引。由于state已经是PK的一部分,因此该索引甚至不会占用更多空间,因为PK始终是InnoDB中任何索引的一部分。

Additonaly我建议您创建一个genders表(gender_id,gender_name),并在引用genders.gender_id的大表上使用外键。这就是你让你的桌子和索引更小。