是。通常,散列摘要存储为十六进制数字的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秒。虽然我们可以测量速度的相对差异,但速度的绝对差异是微不足道的。
所以我会重申:
>测量,不要猜测或假设。你的教育猜测将是错误的很多时间。测量你做出的每一个变化之前和之后,所以你知道它有多少帮助。>投资你的时间和注意力,在那里你得到最大的爆炸的钱。>不要出汗的小东西。当然,微小的差异与足够的迭代相加,但是考虑到这些迭代,仍然优选具有更大绝对优势的性能改进。