对于webscraper,我将在表格中存储500万个+完整网址。 我需要经常检查表中是否存在url。
哪种列类型和策略最适合性能?
或
还是完全不同的策略?
答案 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
可能引用不同的内容或可能相同 - 我也会考虑保留内容的哈希值。