我有一个包含 350,000 多行的 MySQL-InnoDB 表,其中包含一些内容,如 id、otherId、shortTitle 等。现在我需要一个 Bool/Bit 字段来存储数百或数千行这些行。我应该只是将该 bool 字段添加到表中,还是应该最好创建一个引用旧表 ID 的新表 - 从而不会冒对访问第一个表的所有旧现有函数造成性能问题的风险?
(附带信息:我从不使用“SELECT * ...”。主表有很多阅读,很少写作。)
我有一个包含 350,000 多行的 MySQL-InnoDB 表,其中包含一些内容,如 id、otherId、shortTitle 等。现在我需要一个 Bool/Bit 字段来存储数百或数千行这些行。我应该只是将该 bool 字段添加到表中,还是应该最好创建一个引用旧表 ID 的新表 - 从而不会冒对访问第一个表的所有旧现有函数造成性能问题的风险?
(附带信息:我从不使用“SELECT * ...”。主表有很多阅读,很少写作。)
添加字段确实会稍微影响性能,因为您的表格行会变大,但这对于BIT
字段来说几乎不是问题。
最有可能的是,每页的行数完全相同,这意味着性能完全没有下降。
另一方面,使用 extraJOIN
访问另一个表中的行值会慢得多。
我会将该列添加到表中。
新列表示什么?
从数据建模的角度来看,如果该列属于使用的任何范式下的数据,则将其与数据放在一起;性能影响该死。如果该列不直接属于该表,则将其放在具有外键的第二个表中。
实际上,在大约 350,000 的表上添加新列对性能的影响不会特别大。您是否尝试过ALTER TABLE
针对副本发布声明,可能是在本地工作站上?
我不知道为什么人们坚持将 350K 行表称为大。在大型机世界中,这就是 DBMS 配置表的大小:-)。
也就是说,您应该以第三范式设计表格。当且仅当您有性能问题时,您才应该考虑去规范化。
如果您有一列仅适用于某些行,则(可能)将其放在同一个表中不会是 3NF。您应该在“主”表中有一个带有外键的单独表。
请记住,如果布尔字段实际上不适用于某些行。这与应用于所有行但不为某些行所知的字段不同。在这种情况下,主表中的可为空列会更好。但这听起来不像你描述的那样。
为下一个条目需要一个位字段听起来就像您想要实现继承一样。如果是这种情况,我会将其添加到新表中以保持可读性。否则,是否将其添加到主表都没有关系,除非您的查询不使用索引,在这种情况下,我会在做出任何其他有关性能的决定之前先更改它。