Chr*_*ris 4 mysql partitioning
我正在考虑对 InnoDB 数据库中的表进行分区。我有一个对应于 UTC 时间戳的列,我想围绕它进行分区。
我想要捕捉的基本思想是一个分区方案,其中具有固定数量的分区,我们按如下方式循环它们:
给定 3 个分区(为简单起见 3 个)
- 从第 1 天起带有时间戳列的数据进入分区 1
- 第 2 天带有时间戳列的数据进入分区 2
- 第 3 天带有时间戳列的数据进入分区 3
- 第 4 天带有时间戳列的数据进入分区 1
- ..... 第 5 天 .... 分区 2
- ...冲洗并重复
基本上,从时间戳中提取日期并将行放入分区中DAY MOD N,其中DAY是时间戳对应的日期(过滤掉小时/分钟/秒)并且N是分区数。
这可能很容易完成,但我找不到类似的例子来模拟这一点。ALTER TABLE以这种方式进行分区的查询是什么?
更新
根据 atxdba 的建议,我尝试按哈希分区。我尝试了以下语句:
ALTER TABLE table_to_partition PARTITION BY HASH(DAYOFMONTH(FROM_UNIXTIME(my_timestamp))) partitions 8;
Run Code Online (Sandbox Code Playgroud)
这导致错误代码 1564:This partition function is not allowed. 查看此分区限制列表,似乎不支持 FROM_UNIXTIMESTAMP 对表进行分区,因此需要从时间戳到日期的不同转换。
您不能使用 FROM_UNIXTIME() 因为哈希分区必须基于整数表达式。但是假设您的时间戳存储为整数,您可以使用DIV返回一个整数。
这是按照您描述的方式进行分区的演示:
mysql> create table table_to_partition (
my_timestamp int unsigned primary key
) partition by hash(my_timestamp DIV (60*60*24)) partitions 3;
mysql> insert into table_to_partition values (unix_timestamp(now()));
mysql> insert into table_to_partition values (unix_timestamp(now()-interval 1 day));
mysql> insert into table_to_partition values (unix_timestamp(now()-interval 2 day));
mysql> insert into table_to_partition values (unix_timestamp(now()-interval 3 day));
mysql> insert into table_to_partition values (unix_timestamp(now()-interval 4 day));
mysql> insert into table_to_partition values (unix_timestamp(now()-interval 5 day));
mysql> select table_name, partition_name, table_rows
from information_schema.partitions where table_name='table_to_partition';
+--------------------+----------------+------------+
| table_name | partition_name | table_rows |
+--------------------+----------------+------------+
| table_to_partition | p0 | 2 |
| table_to_partition | p1 | 2 |
| table_to_partition | p2 | 2 |
+--------------------+----------------+------------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14089 次 |
| 最近记录: |