MySQL多行与将值存储在一个字符串中

时间:2018-06-08 13:11:55

标签: mysql sql

我只是想知道在CHAR或VARCHAR中存储大量布尔值的效率

data
"TFTFTTF"

VS

isFoo  isBar isText
false  true  false

通过以这种方式切换存储这些值,是否值得表现更差?我认为只设置一个值而不是拥有所有其他字段

会更容易

感谢

4 个答案:

答案 0 :(得分:7)

不要这样做。 MySQL提供的char(1)tinyint等类型占用与单个字符相同的空间。此外,MySQL提供枚举类型,如果您希望您的标志具有多个值 - 并且值可以识别。

最后一点是关键点。您希望您的代码有意义。字符串'FTF' 有意义。列isFooisBarisText 列有意义。

无需模糊数据模型。

答案 1 :(得分:2)

这不是一个坏主意,它不仅在使用的空间方面没有优势,而且对查询性能和数据模型的可理解性也有不良影响。

磁盘空间

就存储使用情况而言,数据是存储在单个varchar(n)char(n)列还是存储在多个tinyntchar(1)或{ {1}}列。只有在使用bit(1)时,每个条目才需要1到2个字节的磁盘空间。

有关不同数据类型的存储要求的详细信息,请参阅MySql documentation

查询效果

如果布尔值存储在varchar中,则搜索特定值为True的所有条目将花费更长的时间,因为查找正确的条目需要字符串操作。即使在搜索布尔值的组合(例如" TFTFTFTFTT")时,查询仍然需要比布尔值存储在各个列中更长的时间。此外,您可以将索引分配给单个列,如isFoo或isBar,这对查询性能有很大的积极影响。

数据模型

数据模型应尽可能易于理解,并且如果可能,应独立于任何类型的实现注意事项。

答案 2 :(得分:1)

实际上,数据库字段应该只包含一个原子值,也就是说:一个不能细分为单独部分的值。

不包含原子值的列:

  • 无法排序
  • 无法分组
  • 无法编入索引

所以,让我们说你想要找到isFoo为真的所有行,除非你要像#34那样进行字符串操作,否则你将无法做到这一点;找到第三个此字符串中的字符,看它是否等于" F"。这意味着每次查询都会进行全表扫描,这会极大地降低性能。

答案 3 :(得分:0)

这取决于以这种格式存储数据后您想要做什么。 检索此记录后,如果要通过检查特定条件加载数据,则必须在服务器端进行进一步处理,从而使性能恶化。服务器中的逻辑会变得复杂。 列isFoo,isBar和isText将帮助您更好地编写查询。