使用 PHP,我有一个带有 Actions
表的 MySQL 数据库,用户可以在其中选择性地将操作分配给他们网站中的某些页面。每个此类分配都会产生一个操作行,其中包含(除其他外)唯一的 ActionId
和相应页面的 URL。
稍后,当在特定页面的上下文中时,我想查明是否有分配给该页面的操作,并获取 (SELECT
) 适当的操作行。那时我知道我的页面的 URL,所以我可以通过这个相对较长的字符串搜索 Actions
表。我怀疑这不是在数据库中搜索的最佳方式。
我假设更好的方法是使用某种哈希将我的长 URL 字符串转换为整数,确保没有两个不同的 URL 被转换为相同的整数(加密不是这里的问题)。有这样的PHP函数吗?或者,是否有更好的策略?
注意我已经看到了这个:SQL performance searching for long strings - 但它似乎并没有真正提出一个可靠的解决方案,除了提到 md5
(它散列成一个字符串,而不是整数)。
最佳答案
散列策略是一个很好的策略。
处理 URL 字符串可能确实是个问题,因为它们可能很长,并且包含很多特殊字符,这对于 MySQL 搜索(REGEXP
或 LIKE
)。
这就是哈希解决问题的原因。即使 md5
不是用于散列密码的良好散列函数(因为它不再安全),也适用于散列 URL。
通过这种方式,您会将 http://www.stackoverflow.com
更改为 4c9cbeb4f23fe03e0c2222f8c4d8c065
,这将非常独特(除非您非常不幸) .
设置完 md5_url
字段后,您可以使用以下方式进行搜索:
SELECT * FROM Actions where md5_url=?
?
是当前 URL 的 md5($url)
。
当然一定要在你的md5_url
字段上设置一个索引:
ALTER TABLE Actions
ADD md5_url varchar(32),
ADD KEY(md5_url);
关于按字符串搜索 PHP MySQL 表 - 使用散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20681332/