【问题标题】:Asking for suggestions on database table design base on this described scenario根据此描述的场景征求有关数据库表设计的建议
【发布时间】:2014-01-15 01:35:08
【问题描述】:

这可能是一个奇怪的情况,但它突然出现在我的脑海中......
想象一下,我有一个每天需要 100 万个新行的数据库表。表中有 3 列:id、value、date。

我想对这些行做的是根据日期加载所有行。

问题来了:

鉴于此表的性质和我使用它的方式(我只需要获取特定日期的行列表),性能方面,确实创建了一个具有相同结构但每天以日期命名的新表(即,创建名称为 01Jan2014, 02Jan2014, ... 每个包含 100 万条记录的表)优于将所有行放在一个表中并将日期列作为索引?

【问题讨论】:

标签: database-design relational-database database-performance sharding large-data-volumes


【解决方案1】:

无需创建多个表。您可以使用Partitioning 定义一张表,因此它看起来是一个逻辑整表,但在内部它存储为多个具有相同结构的物理表。

CREATE TABLE a_database_table (
 id INT AUTO_INCREMENT,
 date DATE NOT NULL,
 value TEXT,
 PRIMARY KEY (id, date)
) PARTITION BY RANGE COLUMNS (date) (
  PARTITION p1 VALUES LESS THAN ('2014-01-01'),
  PARTITION p2 VALUES LESS THAN ('2014-01-10'),
  PARTITION p3 VALUES LESS THAN ('2014-01-20'),
  PARTITION p4 VALUES LESS THAN ('2014-02-01'),
  PARTITION pN VALUES LESS THAN (MAXVALUE)
);

随着数据接近最后一个分区(甚至在它开始填充最后一个分区之后),您可以对其进行拆分:

ALTER TABLE a_database_table REORGANIZE PARTITION pN INTO (
  PARTITION p5 VALUES LESS THAN ('2014-02-10'), 
  PARTITION pN VALUES LESS THAN (MAXVALUE)
);

分区的优点是针对特定日期的查询将“修剪”其对表的访问,因此它只读取一个相关分区。如果您的查询是特定日期的,这会自动发生,并且 MySQL 可以推断哪个分区包含您要查找的行。

【讨论】:

  • 在创建表的时候是否需要配置分区?或者我可以在创建表并且已经有行之后添加它?
  • 是的,您可以使用 ALTER TABLE 将未分区的表转换为已分区的表,即使其中包含大量数据。但数据越多,重组所需的时间就越长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2012-07-23
  • 2019-08-19
  • 2014-11-09
  • 1970-01-01
相关资源
最近更新 更多