【问题标题】:PHP MySQL table search by string - use hashing?PHP MySQL表按字符串搜索 - 使用散列?
【发布时间】:2014-01-08 00:00:01
【问题描述】:

使用 PHP,我有一个带有 Actions 表的 MySQL 数据库,用户可以在其中选择将操作分配给其网站中的某些页面。每个此类分配都会产生一个操作行,其中包含(除其他外)唯一的 ActionId 和相应页面的 URL。

稍后,在特定页面的上下文中,我想了解是否有分配给该页面的操作,并获取 (SELECT) 适当的操作行。当时我知道我的页面的URL,所以我可以通过这个比较长的字符串搜索Actions表。我怀疑这不是在数据库中搜索的最佳方式。

我认为更好的方法是使用某种散列方法将我的长 URL 字符串转换为整数,确保没有两个不同的 URL 被转换为同一个整数(加密不是这里的问题)。有这样的PHP函数吗?或者,有没有更好的策略?

注意我已经看到了这个:SQL performance searching for long strings - 但它似乎并没有提出一个可靠的解决方案,除了提到md5(它散列成一个字符串,而不是整数)。

【问题讨论】:

  • 为什么不使用页面 ID 作为参考?此外,VARCHAR 不应该花那么长时间来搜索,它是 TEXT 类型,您应该担心大规模搜索。此外,根据您的数据库的大小,它可以足够快也可以非常慢。
  • 如果您的网址是唯一的,您可以在该列上创建一个唯一索引并在该列上进行搜索。
  • 一个正确索引的列的搜索速度非常快,几乎与搜索字符串的长度无关。在考虑如此复杂的方案之前,您是否真的尝试过并证明它太慢了?

标签: php mysql string hash integer


【解决方案1】:

如果为列添加索引,数据库应该为你处理效率,URL的长度应该没有区别。

【讨论】:

    【解决方案2】:

    散列策略是一个很好的策略。

    处理 URL 字符串可能确实是个问题,因为它们可能很长,并且包含许多特殊字符,这对于 MySQL 搜索(REGEXPLIKE)总是有问题。

    这就是散列解决问题的原因。即使md5 不是一个很好的散列密码散列函数(因为它不再安全),也可以散列 URL。

    这样您将把http://www.stackoverflow.com 更改为4c9cbeb4f23fe03e0c2222f8c4d8c065,这将是非常独特的(除非您非常不走运)。

    设置好md5_url 字段后,您可以使用:

    SELECT * FROM Actions where md5_url=?
    

    其中? 是当前网址的md5($url)

    当然一定要在md5_url 字段上设置索引:

    ALTER TABLE Actions
    ADD md5_url varchar(32),
    ADD KEY(md5_url);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 2020-07-07
      • 2018-03-29
      • 2016-03-15
      • 2011-11-22
      • 2020-04-10
      • 1970-01-01
      相关资源
      最近更新 更多