基于月份划分mysql表

toe95027  于 2022-12-17  发布在  Mysql
关注(0)|答案(1)|浏览(97)

我是MySql的新手,假设我有一个这样的表:

**Month table**
-----------------
id  month data
1    1    0.5
2    1    0.8
3    2    0.12
4    2    0.212
5    2    1.4
6    3    5.7
7    4    6.8

我如何根据月份将其拆分为不同的表,并使这些表在磁盘中可用?如果可以,我如何在以后引用这些表?例如:

**January table**
-----------------
id   month data
1     1     0.5
2     1     0.8

**February table**
-----------------
id   month  data
1     2     0.12
2     2     0.212
3     2     1.4

**March table**
-----------------
id   month  data
1     3     5.7

**April table**
-----------------
id   month  data
1     4     6.8

等等。
谢谢你的帮助。
我研究了按范围分区,但我不认为它能满足我的目的,因为它不能创建更小的表。我想写一个过程,但不知道从哪里开始。

jslywgbw

jslywgbw1#

如果您的目的只是简单地按月加快查询速度,那么只需在month或timestamp列中添加一个索引即可。分区可以加快查询速度,但也会减慢查询速度。

  • 我研究了按范围分区,但我认为它不能满足我的目的,因为它不会创建更小的表。*

This is incorrect .
分区将这一概念推进了一步,它使您能够根据可以根据需要设置的规则在文件系统中分布各个表的各个部分。实际上,表的不同部分作为单独的表存储在不同的位置。
你可以按月份将alter your existing table分成12个分区。如果你已经有一个月份列...

alter table month_table
partition by list(month) (
  partition January values in (1),
  partition February values in (1),
  -- etc ---
);

如果您有一个日期或时间戳列,请将其转换为月份。

alter table month_table
partition by list(month(created_at)) (
  partition January values in (1),
  partition February values in (1),
  -- etc ---
);
  • ...以后如何引用这些表 *

一般来说,你不引用单独的分区。你插入和查询主表。分区点是透明的。如果有一个适用的where子句将从相关分区读取。

-- This will read from the February partition.
select * from month_table where "month" = 2;

-- This will read from both the February and March partitions.
select * from month_table where "month" in (2,3);

但是您可以使用分区的名称通过partition子句查询各个分区。

SELECT * FROM month_table PARTITION (January);

除了调试每个分区中的内容外,通常不需要执行此操作。

相关问题