Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在数据库中存储散列的最佳方法_Sql_Oracle_Mariadb - Fatal编程技术网

Sql 在数据库中存储散列的最佳方法

Sql 在数据库中存储散列的最佳方法,sql,oracle,mariadb,Sql,Oracle,Mariadb,我需要从性能和存储的角度找出存储散列的最佳方法,例如MD5。目前的数据库是MariaDB,将来可能是Oracle。该表将包含数亿或数十亿条记录,每条记录应包含一个可用于搜索的哈希值。在存储散列时,我使用varchar(32),但我认为这种类型不是最佳的。我还考虑了像binary、char这样的类型,正如我对稳定大小的理解,比如在hash中,使用char代替varchar和binary代替varbinary更好。另外,我想把散列转换成数字,这样会更好吗? 那么,在数据库中存储散列的最佳方式是什么呢

我需要从性能和存储的角度找出存储散列的最佳方法,例如MD5。目前的数据库是MariaDB,将来可能是Oracle。该表将包含数亿或数十亿条记录,每条记录应包含一个可用于搜索的哈希值。在存储散列时,我使用varchar(32),但我认为这种类型不是最佳的。我还考虑了像binary、char这样的类型,正如我对稳定大小的理解,比如在hash中,使用char代替varchar和binary代替varbinary更好。另外,我想把散列转换成数字,这样会更好吗? 那么,在数据库中存储散列的最佳方式是什么呢?

简单的回答是,每个数据类型都应该以RDBMS支持的本机格式存储

这是用于MD5哈希代码的Oracle原始(16)

您可以看到这个类比——有些人决定使用VARCHAR格式存储
DATE
列。你得到 独立于数据库,但不能使用
RDBMS
DATE
列提供的任何功能

无论如何,你应该仔细考虑为什么在数据库中使用哈希列。

如果它是快速识别行-列更改的替代品,则可以节省大量的编码和处理

要将哈希代码用作密钥,请尝试找到至少一个原因,即与使用序列生成的密钥相比,您将从哈希密钥中获益

在您自己的实现中看到所描述的积极效果之前,请小心不要仅将哈希用作键,因为这是从某些来源推荐的

在Oracle中,最多可使用4000字节,对于较大的值,可使用
BLOB


如果哈希函数生成一个数字,则可以使用将其转换为
RAW
数据类型。

MySQL/MariaDB:
BINARY(16)
。它占用16个字节,足以支持MD5。显然,您需要在列上添加
索引

但让我指出一个使用哈希的设计缺陷

如果您有10亿行,但无法缓存其中的一小部分,那么任何查找都很可能需要磁盘命中。这是因为MD5(或UUID或…)的随机性。内存缓存(InnoDB的缓冲池,在MySQL/MariaDB的情况下)不太可能有包含下一个所需值的块

算算。磁盘块(未缓存)的读取速度有多快?上面的一点算术运算可以告诉您每秒可以执行多少次读取。旋转驱动器:10毫秒-->100次读取/秒。多线程将无济于事。RAID条带化将有所帮助

类似地,
插入
也被限制在大约相同的数量。在插入十亿行的早期,由于缓存,事情会变得很快;稍后,它将减慢到100行/秒。插入十亿行需要几个月的时间

分区
不会提高性能


您可能需要代码(在SQL或您的应用程序中)在函数提供的任何内容和
二进制
(类似于
BLOB
)之间进行转换。

哈希计算的结果是二进制值,因此应将其存储为二进制值。转换为十六进制字符串将使其存储大小增加一倍,而转换为数字则会使存储大小增加更多。为什么要使用哈希?散列的来源是什么?哈希是如何使用的?VARCHAR2数据类型有什么问题?它非常适合你的需要。但我可能会增加长度,以便生成更多唯一的散列值。顺便说一句,如果哈希是在一个单列上构建的,您可能不需要计算并存储它以进行搜索,而是使用哈希分区。此时我使用MD5,但可能会将其更改为SHA256,哈希的来源是其他field insight行中的数据。散列将用于公共标识并证明正确性(数据未被泄露)。此时varchar是正常的,但如果表包含数亿行,并且每行都包含此哈希以进行标识,则可能会很慢。可能会很慢,但不是因为varchar。它将具有与NUMBER或RAW相同的性能。至少一个原因是,您将从哈希键中获益:哈希始终返回相同的值,而序列取决于插入的顺序。我并不提倡DataVault 2.0,但能够独立加载父/子表并在不同系统上获得相同的密钥真的很好。我不会使用哈希作为密钥,它只是一个可以使用的标识符,可以保证数据的正确性。