哈希索引什么时候变得合理?


4

MySQL本身不支持哈希索引。因此,制作一个伪哈希列并在哈希列上创建索引需要一些思考。

而且似乎人们普遍认为,如果文本字段很长,那么哈希值得他们需要的开销。但文本应该多久才能开始考虑哈希?

如果我打算使用128位散列,那么对于文本列,有多少个字符阈值是足够的最小值?

编辑在我的另一个问题中列出的详细信息可能很有用https://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram

  0

你的要求是什么?只有在查询优化器将使用它们的表单中存在查询时,索引才会发挥作用。有问题的数据的性质是什么?你会做什么类型的查询涉及这些数据? 14 9月. 112011-09-14 18:18:53

  0

以下是该项目的描述http://stackoverflow.com/questions/7403167/index-on-url-or-hashing-considering-ram 14 9月. 112011-09-14 18:49:42

3

它开始保存磁盘时开始变得合理。但与此同时,它开始占据你的计算能力。

如今磁盘空间被认为是便宜的,但如果你使用SSD那么它并不便宜。因为你需要完全匹配,所以它不会占用太多的CPU,所以它可能是一个更好的选择。

对于满足哈希值使用的文本列长度问题的确切答案可能会因DBA加载系统的技能而有很多因素。

但是如果使用哈希值节省超过50%的RAM并且总RAM节省至少2GB,那么我认为可能值得采用这条路线,否则可能是不必要的排练。


3

我不确定你想要哈希索引的原因是什么。

但是,如果您正在寻找索引text/varchar列,那么您可以使用MyISAM /全文,或者您可以使用像Sphinx或Lucene这样的外部内容。

或者,您可以创建一个带有另一个散列版本的附加列,只要其长度不超过1000个字节,就可以通过MySQL对其进行索引。

我希望我已经回答了你的问题。

  0

我查看伪哈希索引的原因是因为我的表包含1.5亿条记录而我的内存有限(8GB)所以我想优化我的索引并且不想将索引放在文本列上,因为它会占用太多内存。 14 9月. 112011-09-14 17:55:51

  0

您可以(并且必须)指定要索引的文本列的字符数。在mytextcolumn(1000)中 - 1000是极限。我会让MySQL处理内存部分,因为它在这方面非常好。或者,使用Sphinx来完成这些工作可能是最合适的工具。 15 9月. 112011-09-15 06:58:59

  0

为什么我应该在文本列具有可变长度时将索引放在文本列上,而不是创建哈希列并在哈希列上放置唯一约束。将索引放在哈希列上的唯一问题是尽可能地减少冲突。 15 9月. 112011-09-15 16:42:11

  0

您可以创建另一个散列列并对其编制索引,也可以将自己的代码添加到应用程序中以便以此方式进行搜索。我只想说这是一个已经使用其他工具解决的问题,并且已经在很大程度上得到了其他人的验证。如果你想看看你的方式是否有效并且不那么复杂,那么我的一切意味着,试一试。 16 9月. 112011-09-16 10:41:14

  0

实际上这些工具适用于像sphinx这样的全文搜索解决方案。但是我更感兴趣的是知道什么时候可以采用16个字节的哈希值。比如,不是存储100个字节的文本列(当添加索引时),使用16个字节是值得的。最重要的是,只需要精确匹配而不是范围扫描。 16 9月. 112011-09-16 18:45:01


0

阅读完您的描述后,我可以看到哈希是如何理解的。但是,当您谈论内存使用时,索引列的大小不会使搜索大型数据集成为不可能。mysql的基本索引技术是btree。Btrees分而治之。

我可以给出的具体建议是:假设您将使用md5()哈希。为了获得最大效率,您应该将散列作为innodb引擎表的主键,其中散列是char(32)。由于innodb具有聚簇索引,因此检索数据将节省磁盘读取,并且还可以减少使用char时需要完成的工作,因为您可以这样做,因为md5()哈希的结果永远不会改变。

  0

当目的是节省RAM然后使用InnoDB将是一个明智的决定? 15 9月. 112011-09-15 16:44:51