哪个更好存储哈希值或从中生成哈希值的bigint变量

时间:2012-05-24 04:58:41

标签: mysql image hash microtime

我有一个表,其中一个列存储图像src,它是哈希值,并且该哈希值是从microtime()生成的。现在我有两个选择直接在数据库中存储哈希值或存储该图像的bigint microtime名字是派生出来的。哪会使我的数据库更快。

2 个答案:

答案 0 :(得分:1)

我们必须从各方面对此进行分析,以评估所产生的速度故障。

我会做一些假设:

  • 此数据将用作标识符(主键,唯一键,复合键);
  • 此数据用于搜索和加入;
  • 您正在使用哈希算法(如SHA1)生成一个40个字符的十六进制编码数据字符串(MD5产生一个32个字符的十六进制编码数据字符串,如果您正在使用它,则所有下标可以调整为MD5);
  • 您可能有兴趣将哈希的十六进制值转换为二进制,以将所需的存储量减少一半并提高比较速度;
在应用程序端

插入正在更新

正如@Namphibian所述,由BIGINT的2个操作与CHAR的3个操作组成。

但是我认为速度差异并不大。您可以运行10.000.000连续计算(在while循环中)并对它们进行基准测试,以找出它们之间的真正差异。

应用程序代码中的速度差异也会线性影响用户,而当流量增加时,DB中的速度差异会非线性地影响用户,因为重叠写入必须等待彼此,并且某些读取必须等待写入完成。

数据库端

插入正在更新

对于BIGINT几乎与CHAR(40)或BINARY(20)相同,因为等待访问磁盘而不是实际写入磁盘的时间消耗更严重。

数据库端

选择加入

与CHAR(40)或BINARY(20)相比,BIGINT的总是更快,原因有两个:

  • BIGINT存储在8个字节中,而CHAR(40)存储在40个字节中,BINARY(20)存储在20个字节中;
  • BIGINT的连续性增加使其具有可预测性,易于比较和排序。

第二个最佳选项是BINARY(20),因为它保存了一些空间,并且由于长度减少而更容易比较。

BINARY(20)和CHAR(40)都是散列机制的结果并且是随机的,因此比较和排序平均需要更长的时间,因为索引中的随机数据(对于btree索引)需要更多的树遍历fetch(我的意思是在多个值的上下文中,而不是单个值)。

答案 1 :(得分:0)

这里可能适用一项重要的科学原则:不要丢失原始数据。你永远不知道你可能需要它。