我为列和表名的含糊不清道歉。 我的数据库有两个表A和B.它们是这些表之间的多对多关系。
表A 有大约200条记录
Column 1 . Associated Id(from table A)
eg . abc 12
abc 21
pqr 42
表B有大约50亿条记录
Column 1 Associated Ids
abc 12, 21
pqr 42
我正在尝试优化数据存储在表B中的方式,因为它有很多冗余数据。我想到的结构如下
CREATE TABLE `A` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`creat_usr_id` varchar(20) NOT NULL,
`creat_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`modfd_usr_id` varchar(20) DEFAULT NULL,
`modfd_ts` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `A_ak1` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=277 DEFAULT CHARSET=utf8;
CREATE TABLE `B`(
`col1` varchar(128) NOT NULL,
`id` int(11) NOT NULL,
`added_dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`creat_usr_id` varchar(20) NOT NULL,
`creat_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`col1`,`id`,`added_dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (UNIX_TIMESTAMP(added_dt))
(PARTITION Lessthan_2016 VALUES LESS THAN (1451606400) ENGINE = InnoDB,
PARTITION L`Ω`essthan_201603 VALUES LESS THAN (1456790400) ENGINE = InnoDB,
PARTITION Lessthan_201605 VALUES LESS THAN (1462060800) ENGINE = InnoDB,
PARTITION Lessthan_201607 VALUES LESS THAN (1467331200) ENGINE = InnoDB,
PARTITION Lessthan_201609 VALUES LESS THAN (1472688000) ENGINE = InnoDB,
PARTITION Lessthan_201611 VALUES LESS THAN (1477958400) ENGINE = InnoDB,
PARTITION Lessthan_201701 VALUES LESS THAN (1483228800) ENGINE = InnoDB,
PARTITION pfuture VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;
将新行添加到表A时,“关联ID”列可以有更新。
在这种情况下,这是一个很好的结构吗?如果是,“关联ID”的列类型应该是什么?我正在使用mysql数据库。
创建表语句。
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Index_type Comment Index_comment
B 0 PRIMARY 1 col1 A
2 NULL NULL BTREE
B 0 PRIMARY 2 id A
6 NULL NULL BTREE
B 0 PRIMARY 3 added_dt A
6 NULL NULL BTREE
指标的影响。
{{1}}
答案 0 :(得分:0)
col1
varchar(128)NOT NULL,此专栏多久重复一次?那就是,值得它“正常化吗?”
id
int(11)NOT NULL,将此列的大小减半(4个字节 - > 2),因为您只有200个不同的ID:
a_id SMALLINT UNSIGNED NOT NULL
值范围:0..65535
added_dt
时间戳NOT NULL DEFAULT CURRENT_TIMESTAMP,请解释为什么这是PK的一部分。这是一件相当奇怪的事情。
creat_usr_id
varchar(20)NOT NULL,creat_ts
时间戳NOT NULL DEFAULT CURRENT_TIMESTAMP,将这些视为混乱,除非你能证明以这种方式跟踪50亿次行动是合理的。
col1
,id
,added_dt
)我敢打赌,你最终会在同一秒内获得两排。 PK是'独特的'。也许你只需要(col
,a_id)`?否则,您允许多次添加col-a_id对。或者您可能希望IODKU添加新行而不是更新时间戳?
如果(并且可能只有)打算删除“旧”行,这很有用。另外请解释你选择分区的原因。
如果没有看到主SELECTs
,很难查看架构。对于大型表格,我们还应该审核INSERTs
,UPDATEs
和DELETEs
,因为每个表都可能造成严重的性能问题。
每秒插入100行,添加5B行需要一年多的时间。这些行的进入速度有多快?这也可能是一个重要的性能问题。