首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最大限度地提高超长数字的数据库性能

最大限度地提高超长数字的数据库性能
EN

Stack Overflow用户
提问于 2017-08-01 17:29:32
回答 2查看 164关注 0票数 4

我有数字化的图像哈希,哈希像2k整数长。在数据库和搜索中存储它的最佳解决方案是什么?行数将至少为300万。关于表演的建议?我正在考虑创建utf8_bin排序列,将所有数字转换为区分大小写的散列并在列上添加索引,或者还有其他更好的解决方案?

附注:哈希可以修改,1k整数不太准确,所以我更喜欢存储2k左右。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,该选项将在以后的版本中删除。但是,不要担心,这是不可取的,因为大型索引支持将成为默认行为。不再需要这个选项了,因为它实际上总是开着的。

代码语言:javascript
运行
复制
CREATE TABLE MyTable (
  dhash VARBINARY(3072) NOT NULL,
  UNIQUE KEY (dhash)
);
票数 2
EN

Stack Overflow用户

发布于 2017-08-14 16:33:37

  • MD5只有128位,并且可以在BINARY(16)中存储16字节,如果您有9万亿张图像,那么9万亿个错误的dup中就只有一次机会。仅仅300万行,概率就更小了。
  • 因此,我反对2K整数的需要。(或者你是指数字?)有一些库例程可以接收任意字符串或文件,并快速地将其消化到md5中。(或sha1或sha256等)不要写你自己的哈希代码。
  • 不要对任何仅为数字的字符串使用utf8;使用CHARACTER SET ascii COLLATE ascii_bin。(但上面的BINARY甚至更好;只是如果您来自一串数字,这是不实际的。)
  • 如果字符串或blob是固定长度的,不要使用VAR...
  • 如果你必须使用数字和生活在一个767限制,那么实际的方法是使用2*767数字和UNHEX(),并存储为二进制(767)。(或“`VARBINARY(767)”,如果长度可变。)
  • 在5.7.7之前的版本中,有4个步骤可以达到3072:索引
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45444296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档