Sql 在数据库中存储散列的最佳方法
我需要从性能和存储的角度找出存储散列的最佳方法,例如MD5。目前的数据库是MariaDB,将来可能是Oracle。该表将包含数亿或数十亿条记录,每条记录应包含一个可用于搜索的哈希值。在存储散列时,我使用varchar(32),但我认为这种类型不是最佳的。我还考虑了像binary、char这样的类型,正如我对稳定大小的理解,比如在hash中,使用char代替varchar和binary代替varbinary更好。另外,我想把散列转换成数字,这样会更好吗? 那么,在数据库中存储散列的最佳方式是什么呢?简单的回答是,每个数据类型都应该以RDBMS支持的本机格式存储 这是用于MD5哈希代码的Oracle原始(16) 您可以看到这个类比——有些人决定使用VARCHAR格式存储Sql 在数据库中存储散列的最佳方法,sql,oracle,mariadb,Sql,Oracle,Mariadb,我需要从性能和存储的角度找出存储散列的最佳方法,例如MD5。目前的数据库是MariaDB,将来可能是Oracle。该表将包含数亿或数十亿条记录,每条记录应包含一个可用于搜索的哈希值。在存储散列时,我使用varchar(32),但我认为这种类型不是最佳的。我还考虑了像binary、char这样的类型,正如我对稳定大小的理解,比如在hash中,使用char代替varchar和binary代替varbinary更好。另外,我想把散列转换成数字,这样会更好吗? 那么,在数据库中存储散列的最佳方式是什么呢
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,但能够独立加载父/子表并在不同系统上获得相同的密钥真的很好。我不会使用哈希作为密钥,它只是一个可以使用的标识符,可以保证数据的正确性。