首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >设计存储列表的数据库

设计存储列表的数据库
EN

Stack Overflow用户
提问于 2018-06-05 04:40:35
回答 1查看 53关注 0票数 0

我为列名和表名的模棱两可道歉。我的数据库有两个表A和B。这两个表之间是多对多关系。

表A大约有200条记录

代码语言:javascript
复制
Table A structure
Id.   Definition
12    Def1
42    Def2 .... etc. 

表B有大约50亿条记录

代码语言:javascript
复制
Column 1 .   Associated Id(from table A)
eg . abc      12
     abc      21
     pqr      42

我正在尝试优化数据存储在表B中的方式,因为它有很多冗余数据。我考虑的结构如下所示

代码语言:javascript
复制
Column 1        Associated Ids
abc             12, 21
pqr             42

当新行添加到表A中时,“关联Id”列可以有更新。

在这种情况下,这是一个很好的结构吗?如果是,那么“关联Id”的列类型应该是什么?我正在使用mysql数据库。

创建table语句。

代码语言:javascript
复制
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) */;

索引。

代码语言:javascript
复制
  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       
EN

回答 1

Stack Overflow用户

发布于 2018-06-05 07:04:48

这里有50亿行。让我来看看下面的内容:

  • col1 varchar(128)不为空,

此列多长时间重复一次?也就是说,值得‘正常化’吗?

  • id int(11) NOT NULL,

将此列的大小减半(4字节-> 2),因为您只有200个不同的in:

代码语言:javascript
复制
a_id SMALLINT UNSIGNED NOT NULL

取值范围: 0..65535

  • added_dt时间戳不为空默认CURRENT_TIMESTAMP,

请解释为什么这是PK的一部分。这是一件相当奇怪的事情。

  • creat_usr_id varchar(20) NOT NULL,
  • creat_ts timestamp NOT NULL默认CURRENT_TIMESTAMP,

除非你能证明以这种方式跟踪50亿次活动是合理的,否则就把它们当作杂物扔掉吧。

added_dt)

  • 主键(col1idid

我敢打赌,你最终会在同一秒内得到两行。主键是“唯一的”。也许你只需要(col,a_id)`?否则,您将允许多次添加col-a_id对。或者,您可能希望IODKU添加新行,而不是更新时间戳?

  • PARTITION...

如果(可能只有当)你想要删除‘旧的’行,这是很有用的。否则,请解释为什么选择分区。

在不查看主SELECTs的情况下,很难审查模式。在大型表的情况下,我们还应该检查INSERTsUPDATEsDELETEs,因为它们中的每一个都可能造成严重的性能问题。

如果每秒插入100行,则需要一年多的时间才能添加5B行。这些行将以多快的速度进入?这也可能是一个重要的性能问题。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档