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将未分区的表转换为分区的表,即使其中包含大量数据。但数据越多,重组所需的时间就越长。