PHP MySQL表按字符串搜索 - 使用散列?

时间:2013-12-19 12:03:58

标签: php mysql string hash integer

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

这样您就可以将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);

答案 1 :(得分:0)

如果您向列添加索引,数据库应该为您提高效率,并且URL的长度应该没有区别。