使用PHP,我有一个带有Actions
表的MySQL数据库,用户可以选择为其网站中的某些页面分配操作。每个此类分配都会生成一个操作行,其中包含(以及其他内容)唯一ActionId
和相应页面的URL。
稍后,当在特定页面的上下文中时,我想知道是否有分配给该页面的操作,并获取(SELECT
)相应的操作行。那时我知道我的页面的URL,所以我可以通过这个相对较长的字符串搜索Actions
表。我怀疑这不是在数据库中搜索的最佳方式。
我假设更好的方法是使用某种散列方法将长URL字符串转换为整数,确保没有两个不同的URL转换为相同的整数(加密不是问题)。有这样的PHP功能吗?或者,是否有更好的策略?
注意我已经看到了这一点:SQL performance searching for long strings - 但它似乎没有提出一个坚定的解决方案,除了提到md5
(哈希成为字符串,而不是整数)。
答案 0 :(得分:1)
散列策略是一个很好的策略。
处理URL字符串可能确实是一个问题,因为它们可能很长,并且包含许多特殊字符,这些字符对于MySQL搜索(REGEXP
或LIKE
)总是有问题的。
这就是哈希解决问题的原因。即使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的长度应该没有区别。