我有数字化图像哈希,哈希就像2k整数长.
什么是将其存储在数据库和搜索中的最佳解决方案?
行数至少为300万.对性能的建议?
我正在考虑创建utf8_bin校对列并将所有数字转换为区分大小写的哈希并在列上添加索引,还是有其他更好的解决方案?
附: hash可以修改,1k整数会不太准确,所以我更喜欢存储2k左右.
解决方法:
存储长度最紧凑的方法是使用VARBINARY数据类型存储为二进制字节,而不是使用utf8_bin校对存储的字符串.计算图像的数字哈希值,转换为十六进制数字字符串,然后使用UNHEX()转换为二进制字节.二进制字节存储在等效的十六进制数字字符串的一半空间中.例如,像’FFFF’这样的字符串需要四个字符,但UNHEX(‘FFFF’)存储在两个二进制字节中.
单独存储更紧凑只是对性能的适度改进.
更好的性能优势是使用索引.但InnoDB对索引长度有限制.默认情况下,限制为767字节.
如果设置innodb_large_prefix = 1,则可以将InnoDB增加到3072字节(必须使用DYNAMIC或COMPRESSED行格式,这意味着必须使用每表文件).这应该足以索引哈希的全长.
更新:我在MySQL 5.7.7和MariaDB 10.2中了解到innodb_large_prefix是deprecated,该选项将在以后的版本中删除.但不要担心,它已被弃用,因为大索引支持将成为默认行为.不再需要该选项,因为它实际上始终为ON.
CREATE TABLE MyTable (
dhash VARBINARY(3072) NOT NULL,
UNIQUE KEY (dhash)
);
标签:mysql,indexing,hash,performance
来源: https://codeday.me/bug/20190701/1349386.html