我有数字化的图像哈希,哈希像2k整数长。在数据库和搜索中存储它的最佳解决方案是什么?行数将至少为300万。关于表演的建议?我正在考虑创建utf8_bin排序列,将所有数字转换为区分大小写的散列并在列上添加索引,或者还有其他更好的解决方案?
附注:哈希可以修改,1k整数不太准确,所以我更喜欢存储2k左右。
发布于 2017-08-01 17:57:26
存储long最紧凑的方法是使用瓦比尼数据类型将二进制字节存储为二进制字节,而不是使用带有utf8_bin排序规则的字符串。计算图像的数字散列,转换为十六进制数字字符串,然后使用UNHEX()转换为二进制字节。二进制字节存储在等效十六进制数字字符串的一半空间内。例如,像'FFFF'
这样的字符串需要四个字符,但是UNHEX('FFFF')
存储在两个二进制字节中。
仅以更紧凑的方式存储只是提高性能的一个小小的改进。
更好的性能优势是使用索引。但InnoDB对索引长度有限制。默认情况下,限制为767字节。
如果设置innodb_large_prefix=1
,则可以将InnoDB增加到3072字节(必须使用动态或压缩的行格式,这意味着必须使用每个表的文件)。这应该足够索引您的散列的完整长度。
更新:我了解到innodb_large_prefix
是已弃用中的MySQL 5.7.7和MariaDB 10.2,该选项将在以后的版本中删除。但是,不要担心,这是不可取的,因为大型索引支持将成为默认行为。不再需要这个选项了,因为它实际上总是开着的。
CREATE TABLE MyTable (
dhash VARBINARY(3072) NOT NULL,
UNIQUE KEY (dhash)
);
发布于 2017-08-14 16:33:37
BINARY(16)
中存储16字节,如果您有9万亿张图像,那么9万亿个错误的dup中就只有一次机会。仅仅300万行,概率就更小了。CHARACTER SET ascii COLLATE ascii_bin
。(但上面的BINARY
甚至更好;只是如果您来自一串数字,这是不实际的。)VAR...
。UNHEX()
,并存储为二进制(767)。(或“`VARBINARY(767)”,如果长度可变。)https://stackoverflow.com/questions/45444296
复制相似问题