对于这个特殊的问题,我似乎在网上找不到令人满意的答案;在MySQL中,具有';空';浪费内存;?

对于这个特殊的问题,我似乎在网上找不到令人满意的答案;在MySQL中,具有';空';浪费内存;?,mysql,database,null,nullable,Mysql,Database,Null,Nullable,摘自我之前的一个问题 表说明了评论发生在哪个项目上(帖子、照片或回复) commentid ---- postid ----- photoid-----replyid ----------------------------------------------- 1 22 NULL NULL 2 NULL 56 NULL 3 23

摘自我之前的一个问题

表说明了评论发生在哪个项目上(帖子、照片或回复)

commentid ---- postid ----- photoid-----replyid ----------------------------------------------- 1 22 NULL NULL 2 NULL 56 NULL 3 23 NULL NULL 4 NULL NULL 55 5 26 NULL NULL ... ... ... commentid---postid---photoid---replyid ----------------------------------------------- 1 22无效 2空56空 3 23无效 4零55 5 26无效 ... ... ...
这不好吗?

是的。我不知道有多少,也不知道它是否真的那么相关,但是有太多的空条目是不好的。

更好的结构应该是

commentid  itemid  itemtype
---------------------------
1          22      post
2          56      photo
3          23      post
4          55      reply
5          26      post

您甚至可以添加一个结合了itemid和itemtype列的索引,以便快速查找特定项目的所有注释。

这取决于存储引擎,完全取决于所述存储引擎

例如,在MyISAM中,值是否为NULL既不会占用更多空间,也不会节省空间

在InnoDB中,如果列为NULL,则根本不需要存储它的值,因此可以节省空间。节省的空间量是该值在存在时所占用的大小

更多信息在这里


然而,底线是,两者都不会对性能产生明显的影响。这是一种微观优化,最好根据数据库设计中的合理内容做出决策,而不是根据占用内存少或运行速度快的内容做出决策。

取决于yoiu所说的浪费。使calumn可为Null意味着需要存储某种类型的Null指示器,我不确定MySql,但在其他DBMS中,我知道它是一个smallint,其中“1”表示Null,“0”表示存在值


这两个额外的字节将随列值一起携带到任何地方。因此,在缓冲区和呈现给您的程序的结构中,以及在引用该列的任何索引中,每个可为空的列将存储两个字节。因此,在上面的示例中,20字节的磁盘存储和60字节的内存被“浪费”。若您对此感到担忧,那个么您可能应该在汇编程序中编写所有代码,并使用原始磁盘IO

我知道:(…但这仍然不能回答我的问题“在MySQL中,有'NULL'的列会浪费内存吗?”?表示null是否需要磁盘空间,也是您建议的结构,它是否可以与外键一起使用?如链接到reply和post表中,如果我删除回复,对它的注释也会相应地层叠和删除?如果您能说明这一点,那将是非常好的:)空间使用情况取决于您使用的存储引擎。MyISAM,没有区别,而InnoDB空值不占用存储空间。不,这样的设置不允许外键。另一个选择是将你所有的回复、帖子和照片统一到一个中央“内容”表中,每个表都有一个唯一的id,外键是。[+1以减轻我的痛苦;)]Ah ic,谢谢你的澄清:)。啊,这部分我有点困惑“你甚至可以添加一个结合了itemid和itemtype列的索引,以便快速查找某个特定项目的所有注释。”你的确切意思是什么,我该如何做?