在Mysql中存储URL的最有效方法?

时间:2009-06-17 17:46:15

标签: mysql

我想在MySql中存储大量URL,并在列上创建唯一索引。如果我将列设为utf8,那么我将仅限于varchar(333),这不足以容纳我的一些URL。如果我声明列是latin1然后我得到完整的1000个字符(不要认为我需要那么多)。但是,我必须对URL进行编码,并且始终使用编码的URL保持一致。有没有更好的方法来管理大量的URL?

3 个答案:

答案 0 :(得分:9)

三种好方法:

1)使用TEXT而不是VARCHAR。为了确保唯一性,您还必须创建一个单独的VARCHAR列来存储MD5()或SHA1()哈希并添加UNIQUE或PRIMARY索引。这有一个额外的磁盘寻求检索URL的不幸后果,但取决于您的用例可能没问题。

2)使用带有二进制排序规则的VARCHAR并使用COMPRESS()压缩URL。

3)我忘记了第三个,因为我正在输入前两个。 GRR ...

答案 1 :(得分:5)

您可以考虑的一件事是将URL的主机名和协议部分存储在单独的表中并通过密钥引用它。这也可以在以后用于获取特定主机的所有URL以及帮助解决字符串长度问题。

例如:

PROTOCOLS
-----------------------
PROTOCOL_ID   INTEGER
PROTOCOL      VARCHAR(10)    (i.e., http, https, ftp, etc.)

HOSTS
-----------------------
id       BIGINT
hostname varchar(256)   

URL
-----------------------
PROTOCOL      INTEGER  FK to PROTOCOLS
HOSTNAME      BIGINT   FK to HOSTS
QUERY_STRING  VARCHAR(333)

答案 2 :(得分:0)

我所知道的最常见的做法是使用带有冲突控制的哈希算法,只需使用某种快速的单向编码,这会对URL产生非常低的冲突。

尝试砍掉你知道在所有网址中都相同的部分(例如HTTP://,www等等)。如果网址都是你网域的一部分,也要将其删除。

否则,我会重新思考问题并尝试找到一种不同的方式来完成你想要完成的任何事情。我假设有一组唯一的URL真正解决了其他一些问题。