对表进行分区是否会提高此GROUP BY查询的性能?

时间:2015-10-21 16:40:50

标签: mysql group-by partitioning

我有一个MySQL表data_table

mysql> desc data_table;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(11)          | NO   | PRI | NULL    | auto_increment |
| prod_id    | int(10) unsigned | NO   |     | NULL    |                |
| date       | date             | NO   |     | NULL    |                |
| cost       | double           | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

此表有大约7亿行。我已在prod_iddate上创建了索引。我需要执行这样的查询 -

SELECT `id`, `prod_id`, WEEKOFYEAR(`date`) AS period, SUM(`cost`) AS cost_sum
FROM `data_table` GROUP BY `prod_id`, `period`;

我的问题是 -

在几个月(~20个分区)上对表进行分区会提高此查询的性能吗?

3 个答案:

答案 0 :(得分:1)

根据您编写的记录数和SQL查询,我会说是,如果正确完成,分区会有很大帮助。我会更进一步,在Date字段上建议Range Partitioning。这是一种非常常见的分区方法,运行良好且易于实现。

您没有提及您正在运行的MySQL版本,因此您必须进行一些额外的阅读HERE以了解您的MySQL版本支持的内容。

您也可以在命令提示符下运行此SQL。

mysql> SHOW VARIABLES LIKE %partition%

这应该报告"有分区=是"或" Partition_engine = yes"取决于你的相关。

答案 1 :(得分:1)

如果您发现根据周数存在大量查询,则将周数永久存储为列是有意义的。我们可以在选择期间保存计算。 理想的策略是知道您将运行哪些查询,然后相应地设计表。

答案 2 :(得分:1)

PARTITIONing提供帮助。不是BY RANGE;没有任何其他的味道。

查询必须读取表中的每一行;分区不会改变这一事实,也不会加速它。

现在的查询存在一个无关的问题。它应该为每个id返回GROUP?答:它将返回“随机”id