MySQL 按年和周分区

标签 mysql partitioning

我想使用 mysql 分区表将表分区为 YEAR 和 WEEK 编号。我确切地知道如何使用 mysql 合并表执行此操作,但分区表不同。有人可以帮助下表架构吗?

CREATE TABLE `tableName` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `dateandtime` datetime NOT NULL,
  `othervalue` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

还有是不是一定要在某个引擎里?

如果我将日期和时间存储为 int(10) 时间戳,我该怎么做?

CREATE TABLE `tableName` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `dateandtime` int(10) NOT NULL,
  `othervalue` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

最佳答案

MySQL 5.1 无法按日期进行分区,因此您必须解决...通常您按函数 TO_DAYS(dateandtime) 进行分区,例如:

CREATE TABLE tbl (
... ) ENGINE=InnoDB
PARTITION BY RANGE (to_days(dateandtime)) (
 PARTITION pNULL VALUES LESS THAN (0) ENGINE = InnoDB,
 PARTITION p20111218 VALUES LESS THAN (TO_DAYS('2011-12-18')) ENGINE = InnoDB,
 PARTITION p20111225 VALUES LESS THAN (TO_DAYS('2011-12-25')) ENGINE = InnoDB,
 PARTITION pNew VALUES LESS THAN MAXVALUE ENGINE = InnoDB
)

我在这里定义了 4 个分区——第一个只是为了完整性,这样以后插入日期就不会失败。 (您不能插入一个分区不存在的值。)第一个分区是为了性能——NULL 值将被保留地存储在那里。中间的 2 个分区实际上正在使用,每个分区保留一周的数据。

您可以使用 ALTER TABLE tbl DROP PARTITION xyz 删除旧分区(与仅删除旧行相比,这非常快)。您可以通过拆分最后一个分区来添加新分区:

ALTER TABLE tbl REORGANIZE PARTITION pNew INTO (
  PARTITION p20120115 VALUES LESS THAN (TO_DAYS('2012-01-16')),
  ...
  PARTITION pNew VALUES LESS THAN (MAXVALUE)
);

关于MySQL 按年和周分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8854095/

相关文章:

mysql - Perl(或 R,或 SQL): Count how often string appears across columns

php - 如果数据库中的条目被删除,如何检查 PHP?

php - Doctrine- 有条件地设置查询参数

node.js - Nodejs 和 Kafka 键控分区器

database - 数据库中的历史记录行管理

Mysql left join with or condition for fallback 语言

PHP 表单、下拉列表和 mysql 表

apache-spark - 如何调试传递给mapPartitions的函数

mysql - 分区表使用所有分区用于 MySQL 中的基本 SELECT 语句

sql - 每个月的 CHAR/VARCHAR2 数据类型的范围分区