Database design 根据所描述的场景,征求关于数据库表设计的建议

Database design 根据所描述的场景,征求关于数据库表设计的建议,database-design,relational-database,database-performance,sharding,large-data-volumes,Database Design,Relational Database,Database Performance,Sharding,Large Data Volumes,这可能是一种奇怪的情况,但我突然想到了… 想象一下,我有一个数据库表,每天需要一百万新行。表中有3列:id、值、日期 我想对这些行做的是根据日期加载所有行 问题来了: 鉴于此表的性质和我使用它的方式(我只需要获取特定日期的行列表),从性能角度来看,创建一个具有相同结构但以日期命名的新表(即,创建名为2014年1月1日、2014年1月2日的表,…每个表中有100万条记录)与将所有行放在一个表中,并将日期列作为索引相比,它具有更大的优势?无需创建多个表。可以使用定义一个表,使其看起来是一个逻辑完整表

这可能是一种奇怪的情况,但我突然想到了…
想象一下,我有一个数据库表,每天需要一百万新行。表中有3列:id、值、日期

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

问题来了:


鉴于此表的性质和我使用它的方式(我只需要获取特定日期的行列表),从性能角度来看,创建一个具有相同结构但以日期命名的新表(即,创建名为2014年1月1日、2014年1月2日的表,…每个表中有100万条记录)与将所有行放在一个表中,并将日期列作为索引相比,它具有更大的优势?

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

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可以推断哪个分区包含您要查找的行,则会自动发生这种情况。

Yes。切分:你是说水平分区吗?假设我使用MySQL;在创建表时是否必须进行分区,或者在表中填充了数百万数据后可以将分区添加到表中?在创建表时是否必须配置分区?或者我可以在创建表并且表中已经有行之后添加它?是的,您可以使用ALTER table将未分区的表转换为分区的表,即使其中包含大量数据。但数据越多,重组所需的时间就越长。