我是一个关于数据库设计的新手,偶然发现了以下问题(对于科学数据库 findstat.org):
我有一个包含数百个“组合图”(由整数指定)的列表,每个“组合图”都由大约一万个原像-图像对的列表指定,这两个图都只是整数。原像实际上是连续的整数。
(编辑)该表只能作为一个整体进行读写。永远不需要只访问几个值。更准确地说,“自然”单元是与一个“组合图”相关联的数据。 (编辑结束)
当前的设计(其工作原理)如下:
该表(本质上)有两列:“组合图的 ID”(一个 INT)和“值”,它是一个 LONGTEXT - 1,2,... 的图像,用“|”分隔。
我被告知这并不是真正正确的设计,并尝试了以下变体。新表具有三列:“组合图的 ID”、“原像”和“图像”。
这个新表因此有很多很多行。
问题:
查看内存消耗情况,新表似乎使用了更多内存。这是可以预料的吗? (编辑:事实证明,我大约将内存消耗增加了一倍。这对我来说相当令人惊讶,因为在新设计中,我将整数存储为 INT,而在旧设计中,我将整数存储为文本。 A blog post by Mark Callaghan from 2009 提到开销大约是每行 20 字节,对于 1 250 000 行的表来说大约是 24MB。我本以为将整数存储为文本的开销要大得多,但我错了。编辑结束)
我使用 python 和 sqlalchemy 从空表开始填充此表。对于我的应用程序,首先添加所有行,然后提交似乎是正确的。虽然这对于第一个设计来说没有问题,但我的计算机“内存不足”——也就是说,它开始交换,直到完全没有响应。我是否可能做错了什么,或者"new"设计根本就不好?
最佳答案
您在新设计中执行了正确的设计,实体列中没有非规范化数据。也就是说,单个值,而不是一组值。因此,如果您在单个列中调用分隔符 |
,则它属于逗号分隔列表“值”的类别(在之前或当前的设计中,这很糟糕)。当我说新设计时,我指的是您有更多行并且关心的设计。
拥有更多的行自然会产生更多的存储空间。但请记住,使用正确的索引策略,您的数据将可以更快地访问,并且 SQL 引擎的设计非常出色。
开发人员经常认为他们通过使用逗号分隔列表来为服务器带来好处。他们不是。长远来看。
我认为没有理由创建一个事务,然后插入数十万行,然后提交。只需填充泵启动操作,然后查看您是否对行计数以及可以执行的任何其他健全性检查感到满意。
关于mysql - 内存消耗和正确的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33321378/