PHP + MYSQL存储URL,应使用哪种列类型和策略

时间:2018-03-20 15:35:43

标签: php mysql

对于webscraper,我将在表格中存储500万个+完整网址。 我需要经常检查表中是否存在url。

哪种列类型和策略最适合性能?

  • 包含varchar和索引的url。

  • 带有散列(md5?)的第二个char列并检查它。

还是完全不同的策略?

2 个答案:

答案 0 :(得分:2)

第二种选择。如果您需要检查url是否不存在,那么对URL散列的unique约束是最佳方法。

md5,即使已过时,也可以用于您的用例,因为您有大约500万行,但您不可能发生碰撞。

对于该列,请使用BINARY(16)。您可以将UNHEX(MD5('your url here'));存储到具有固定索引长度的BINARY(16)中。

md5是128位,您不需要人类可读的表示,因此您可以保存“原始”二进制文件,这样可以将存储需求减少一半 - 因此BINARY(16)而不是{BINARY(32) 1}}。

答案 1 :(得分:1)

索引的最大宽度为767字节 - 但是IIRC的URL大小没有上限。即使对于URL,这也相当长。 OTOH,数据越长,DBMS为比较2个值而必须做的工作就越多。

因此,可能不需要使用散列,但会提高性能。

某些mysql引擎支持索引类型的'hash',这样就无需创建新列(但我认为MyISAM和InnoDB不支持这种情况)。 OTOH最新版本的MySQL(和MariaDB,PerconaDB)支持“generated”或虚拟列。因此,在插入/更新时不需要显式设置哈希值(但是您需要在WHERE子句中使用table.hashed=MD5('$yourURL')以允许DBMS使用索引。

就个人而言,如果是我,我会担心在不同的网址下对同一页面进行两次索引 - 尤其是在查询发生变化的情况下:

 http://www.example.com/?r=32323

 http://www.example.com/?r=51515

可能引用不同的内容或可能相同 - 我也会考虑保留内容的哈希值。