我有一个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_id
和date
上创建了索引。我需要执行这样的查询 -
SELECT `id`, `prod_id`, WEEKOFYEAR(`date`) AS period, SUM(`cost`) AS cost_sum
FROM `data_table` GROUP BY `prod_id`, `period`;
我的问题是 -
在几个月(~20个分区)上对表进行分区会提高此查询的性能吗?
答案 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
。