我必须存储用户信用,可以是十进制格式,如(10.99,0.99等)。现在我将列字段作为varchar(100)。
如果我使用decimal而不是varchar怎么办?它会改善性能吗?
答案 0 :(得分:5)
简短的回答是:不,这会损害表现。
答案越长:VARCHAR字段的长度可变,这意味着数据库块的格式不能预先考虑填充数据的大小。当然,这个领域有一个最大长度,但除此之外,你的情况会更糟。
另一方面,读取VARCHAR然后将其解释为适合浮点类型将花费您。它引入了新的问题可能性。尝试获取占“11.99”的所有小数。希望你带上正确的小数位数,因为在VARCHAR“11.99”!=“11.990”。
然后是索引。通常,没有人索引一个十进制字段,但是如果你不这样做,VARCHAR字段上的索引将需要更多的空间。
总而言之,以非特定字段类型保存某些内容并不是一个好主意。在数据库结构中,通常认为最佳做法是尽可能具体。
答案 1 :(得分:2)
令人惊讶的是,您可以通过这种方式节省磁盘空间(从而节省IO时间)。这实际上取决于十进制值是什么以及它们是否会保持在该范围内,并且在执行之前应该完全检查。
select
sum(1+len(cast(Cast(your_decimal_value as real) as varchar(50)))) as size_as_varchar,
size_of_your_decimal_type_in_bytes*count(*) as size_as_decimal
from your_table
如果size_as_varchar远低于size_as_decimal,那么您可能会看到IO绑定查询的性能提升。铸造CPU成本可能抵消收益。
那么,你应该这样做吗?这取决于您的服务器,您的数据,您的查询需要投放多少这些值,以及您的老板对最佳实践偏差的容忍度......但答案可能是否定的。如果你需要这个,你应该使用一个提供行级压缩的数据库,而不是做一些hacky事情来近似行级压缩。
答案 2 :(得分:1)
在某些情况下,您可能希望将类似数值的内容存储为字符串。例如,在美国,5位邮政编码看起来很像数字。但是,领先的零是重要的。所以,它们实际上是标签而不是数字。这是一个明智的做法;邮政编码应存储为字符串。
在大多数其他情况下,您希望将数字存储为数字。一个名为“用户信用”的字段表示您在该字段上进行加法和减法。所以,这也是一个明智的选择。如果看起来像一个数字,像数字一样走路,像数字一样嘎嘎叫。 。 。将其存储为数字。
MySQL确实让选择有点混乱,因为它会自动将字符串转换为数字,即使字符串在数字部分后面有无关的字符。
如果您希望精确存储第二个小数点,则使用定点数据类型(例如DECIMAL(5,2)
)而不是浮点类型(例如float
)。