根据此描述的方案询问有关数据库表设计的建议

时间:2014-01-15 01:35:08

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

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

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

接下来的问题是:

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

1 个答案:

答案 0 :(得分: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可以推断哪个分区包含您正在查找的行,则会自动发生这种情况。