我有一个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%的时间花在复制到临时表上!如何提高此查询的性能?
架构&解释:
答案 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
的大表上使用外键。这就是你让你的桌子和索引更小。