新列或其他表

时间:2018-05-17 06:23:08

标签: mysql database rdbms

每当需要向表中添加新字段时,这是一个困扰我的问题。这里的表有大约15亿条记录(分区和分片,因此它是物理上分开的文件)。现在我需要添加一个可以为null的字段,即varchar(1024),它将接受一些JSON字符串。将来必须增加场长以适应更长的弦。

以下是参数

  1. 此字段的所有现有行都将具有空值。 (收藏新表)
  2. 只有5%的新插入记录具有此值。 (收藏新表)
  3. 表格中的大多数当前查询都需要访问此字段。 (fav。改变)
  4. 根据我存储的位置,我不确定查询内存分配是否可以在此中发挥作用。

    现在我应该添加到当前表,或者定义具有相同主键的另一个表来存储此数据。 您的意见将有助于做出决定。

4 个答案:

答案 0 :(得分:0)

如果您的旧记录不需要具有该varchar字段,那么您应该将其放在另一个表中,同时提取数据会提供与其他主键的连接

答案 1 :(得分:0)

这不是什么大问题,你只需在该表中添加一个列就可以为该新列设置null。

答案 2 :(得分:0)

我认为,无论您提出的3种情况如何,都应该更改现有表格,而不是创建新表格。

我的推理如下:
1)你的桌子非常大(15亿行)。如果您创建一个新表,则会在新表中复制PK 15亿行。

这将导致以下问题:
   a)数据库空间的浪费    b)时间密集。填充15亿行的新表并更新他们的PK是一项非常重要的工作    c)回滚段耗尽。如果在插入新行期间回滚段没有足够的空间,则插入将失败。这将增加数据库碎片。

另一方面,通过改变表格可以避免所有这些问题:
1)没有空间浪费 2)操作不会耗费时间 3)没有回滚段故障或DB碎片的风险。

所以改变表格。

答案 3 :(得分:0)

这两种方法都有优点和缺点。我想我在这两个选项之间找到了妥协。这两种方法都有好处

  • 创建一个新表来保存JSON字符串。此表与第一个表具有相同的主键。假设第一个表是Customer,第二个表是Customer_json_attributes

  • 更改当前表(customer)以添加一个标志,指示JSON字段中是否存在值。说json_present_indicator char(1)。

  • 应用程序设置json_present_indicator =' Y'在第一个表中,如果第二个表中有JSON字段的值,如果没有设置为' N'

    • 选择查询将具有左连接,其中json_present_indicator ='Y'作为连接条件。这将是有效的连接,因为只有当指标为“Y”时,查询才会搜索第二个表。请记住,只有5%的记录在JSON字段中具有值
相关问题