我只是想知道在CHAR或VARCHAR中存储大量布尔值的效率
data
"TFTFTTF"
VS
isFoo isBar isText
false true false
通过以这种方式切换存储这些值,是否值得表现更差?我认为只设置一个值而不是拥有所有其他字段
会更容易感谢
答案 0 :(得分:7)
char(1)
和tinyint
等类型占用与单个字符相同的空间。此外,MySQL提供枚举类型,如果您希望您的标志具有多个值 - 并且值可以识别。
最后一点是关键点。您希望您的代码有意义。字符串'FTF'
不有意义。列isFoo
,isBar
和isText
列有意义。
无需模糊数据模型。
答案 1 :(得分:2)
这不是一个坏主意,它不仅在使用的空间方面没有优势,而且对查询性能和数据模型的可理解性也有不良影响。
磁盘空间
就存储使用情况而言,数据是存储在单个varchar(n)
或char(n)
列还是存储在多个tinynt
,char(1)
或{ {1}}列。只有在使用bit(1)
时,每个条目才需要1到2个字节的磁盘空间。
有关不同数据类型的存储要求的详细信息,请参阅MySql documentation。
查询效果
如果布尔值存储在varchar
中,则搜索特定值为True的所有条目将花费更长的时间,因为查找正确的条目需要字符串操作。即使在搜索布尔值的组合(例如" TFTFTFTFTT")时,查询仍然需要比布尔值存储在各个列中更长的时间。此外,您可以将索引分配给单个列,如isFoo或isBar,这对查询性能有很大的积极影响。
数据模型
数据模型应尽可能易于理解,并且如果可能,应独立于任何类型的实现注意事项。
答案 2 :(得分:1)
实际上,数据库字段应该只包含一个原子值,也就是说:一个不能细分为单独部分的值。
不包含原子值的列:
所以,让我们说你想要找到isFoo
为真的所有行,除非你要像#34那样进行字符串操作,否则你将无法做到这一点;找到第三个此字符串中的字符,看它是否等于" F"。这意味着每次查询都会进行全表扫描,这会极大地降低性能。
答案 3 :(得分:0)
这取决于以这种格式存储数据后您想要做什么。 检索此记录后,如果要通过检查特定条件加载数据,则必须在服务器端进行进一步处理,从而使性能恶化。服务器中的逻辑会变得复杂。 列isFoo,isBar和isText将帮助您更好地编写查询。