mysql 二进制 非_MySQL二进制对非哈希ID的非二进制

博客讨论了在数据库中存储散列值时,使用二进制(BINARY)与字符(CHAR)数据类型的空间效率和性能影响。尽管二进制存储节省空间,但作者指出在性能方面,两种类型差异不大,且二进制可能提供更高的缓存效率。此外,二进制字符串比较在某些情况下速度稍快。建议根据具体应用和查询模式进行测试以确定最佳方案。
摘要由CSDN通过智能技术生成

是。通常,散列摘要存储为十六进制数字的ASCII表示,例如单词’hash’的MD5是:

0800fc577294c34e0b28ad2839435945

这是一个32个字符的ASCII字符串。

但MD5真正产生一个128位二进制散列值。这应该只需要16个字节存储为二进制值而不是十六进制数字。所以你可以通过使用二进制字符串获得一些空间效率。

CREATE TABLE test.foobar (

id BINARY(16) NOT NULL PRIMARY KEY

);

INSERT INTO test.foobar (id) VALUES (UNHEX(MD5('hash')));

回覆。你的意见,你更关心的性能比空间效率:

我不知道任何理由BINARY数据类型将比CHAR快。

如果您有效地使用缓存缓冲区,那么大小可以是性能的一个优势。也就是说,如果字符串是以十六进制存储相同值所需的CHAR的大小的一半,则给定量的高速缓存存储器可以存储两倍于BINARY数据的行。同样,该列索引的高速缓存可以存储两倍。

结果是更有效的缓存,因为随机查询有更大的机会击中缓存的数据或索引,而不需要磁盘访问。缓存效率对于大多数数据库应用程序很重要,因为通常瓶颈是磁盘I / O。如果你可以使用缓存内存来减少磁盘I / O的频率,那么它比在一种数据类型或另一种数据类型之间的选择要大得多。

对于存储在BINARY中的散列字符串和BIGINT之间的差异,我会选择BIGINT。缓存效率将更高,并且对64位处理器整数运算和比较应该非常快。

我没有测量来支持上面的声明。选择一种数据类型取决于另一种数据类型的净益处取决于数据模式和数据库和应用程序中的查询类型。要获得最准确的答案,您必须尝试这两种解决方案并测量差异。

回覆。你的假设二进制字符串比较比默认不区分大小写的字符串比较,我试了以下测试:

mysql> SELECT BENCHMARK(100000000, 'foo' = 'FOO');

1 row in set (5.13 sec)

mysql> SELECT BENCHMARK(100000000, 'foo' = BINARY 'FOO');

1 row in set (4.23 sec)

因此,二进制字符串比较比不区分大小写的字符串比较快17.5%。但请注意,在评估此表达式1亿次后,总差异仍小于1秒。虽然我们可以测量速度的相对差异,但速度的绝对差异是微不足道的。

所以我会重申:

>测量,不要猜测或假设。你的教育猜测将是错误的很多时间。测量你做出的每一个变化之前和之后,所以你知道它有多少帮助。>投资你的时间和注意力,在那里你得到最大的爆炸的钱。>不要出汗的小东西。当然,微小的差异与足够的迭代相加,但是考虑到这些迭代,仍然优选具有更大绝对优势的性能改进。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值