MySQL 本身不支持哈希索引。因此,制作一个伪散列列并在散列列上创建索引需要一些思考。
而且似乎被广泛理解的是,如果文本字段很长,那么哈希值就值得他们需要的开销。但是文本应该多长时间才能开始考虑哈希?
如果我打算使用 128 位散列,那么对于文本列来说,多少个字符阈值才是足够的最小值?
我的另一个问题中列出的编辑详细信息可能有用https://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram
我不确定您想要哈希索引的原因是什么。
但是,如果您正在寻找索引 text/varchar 列,那么您可以使用 MyISAM/full-text,或者您可以使用外部的东西,如 Sphinx 或 Lucene。
或者,您可以使用另一个列的散列版本创建一个附加列,只要它的 1000 字节或更少,那么它就可以被 MySQL 索引。
我希望我已经回答了你的问题。
当它开始保存您的磁盘时,它开始变得合理。但与此同时,它开始占用您的计算能力。
现在磁盘空间被认为很便宜,但如果您使用的是 SSD,那么它并不便宜。由于您需要完全匹配,因此它不会占用太多 CPU,因此它可能是一个更好的选择。
您关于满足使用散列的文本列长度的问题的确切答案可能会根据从 DBA 加载系统的技能开始的许多因素而有所不同。
但是,如果您使用哈希节省超过 50% 的 RAM,并且总 RAM 节省至少 2GB,那么我认为采取这条路线可能值得,否则可能是不必要的排练。
阅读了您的描述后,我可以看到哈希是如何有意义的。但是,当您谈论内存时,使用索引列的大小并不意味着无法搜索大型数据集。mysql的基本索引技术是btree。Btree 分而治之。
我可以给出的具体建议是:假设您将使用 md5() 哈希。为了获得最大效率,您应该将哈希作为 innodb 引擎表的主键,其中哈希是 char(32)。由于 innodb 具有聚集索引,因此检索数据将节省磁盘读取,并且当您使用 char 时需要完成的工作也减少了,因为 md5() 哈希的结果永远不会改变.