mysql - 最大化超长数字的数据库性能

标签 mysql performance indexing hash

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

附言hash 可以修改,1k 整数会不太准确,所以我更喜欢存储 2k 左右。

最佳答案

存储 long 最紧凑的方法是使用 VARBINARY 将其存储为二进制字节数据类型,而不是具有 utf8_bin 排序规则的字符串。计算图像的数字哈希,转换为十六进制数字字符串,然后使用 UNHEX()转换为二进制字节。二进制字节存储在等效的十六进制数字字符串的一半空间中。例如,像 'FFFF' 这样的字符串需要四个字符,但 UNHEX('FFFF') 以两个二进制字节存储。

单独存储更紧凑只是对性能的适度改进。
更好的性能优势是使用索引。但是 InnoDB 对索引长度有限制。默认情况下,限制为 767 字节。

如果您设置innodb_large_prefix=1,您可以将 InnoDB 增加到 3072 字节(您必须使用 DYNAMIC 或 COMPRESSED 行格式,这意味着您必须使用 file-per-table)。这应该足以索引您的哈希的全长。


更新:我了解到 innodb_large_prefixdeprecated在 MySQL 5.7.7 和 MariaDB 10.2 中,该选项将在未来的版本中删除。但别担心,它已被弃用,因为大索引支持将成为默认行为。不再需要该选项,因为它始终有效。

CREATE TABLE MyTable (
  dhash VARBINARY(3072) NOT NULL,
  UNIQUE KEY (dhash)
);

关于mysql - 最大化超长数字的数据库性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45444296/

相关文章:

php - 如何在 php docker 镜像中安装 pdo 驱动程序?

php - 获取所有选中复选框的值并将它们插入数据库 - PHP

python - 如何对 pandas 数据框子集中的列求和

sql - 在 postgres 中复制一个表(包括索引)

excel - 多条件vlookup优化(索引+匹配)

mysql - WordPress主题开发中MySQL数据库的版本控制(SVN)(有代码示例吗?)

mysql - 如何在 Windows 上安排远程 mysql 备份

python - 生成结果值最接近要求的方程,有速度问题

python - 如何在没有多个循环的情况下将多个函数应用于 pandas 数据框?

php - 基于重叠实体数组创建新数组