我希望能够在MySql中存储一组大量的URL,并在该列上创建唯一索引。如果我将列声明为utf8,则将限制为varchar(333),这对于一些URL来说不足够。如果我声明该列为latin1,则可以获得完整的1000个字符(我认为不需要那么多)。然而,我必须对URL进行编码并始终使用编码后的URL以保持一致。是否有更好的方法来管理大量的URL?
我希望能够在MySql中存储一组大量的URL,并在该列上创建唯一索引。如果我将列声明为utf8,则将限制为varchar(333),这对于一些URL来说不足够。如果我声明该列为latin1,则可以获得完整的1000个字符(我认为不需要那么多)。然而,我必须对URL进行编码并始终使用编码后的URL以保持一致。是否有更好的方法来管理大量的URL?
有三种好的方法来实现这个:
1)使用TEXT而不是VARCHAR。为了确保唯一性,您还需要创建一个单独的VARCHAR列来存储MD5()或SHA1()哈希并添加UNIQUE或PRIMARY索引。这会导致额外的磁盘查找以检索URL,但根据您的用例,这可能是可以接受的。
2)使用具有二进制排序规则的VARCHAR,并使用COMPRESS()压缩URL。
3)我在打前两个时忘记了第三个。呃...
你可能想到的一件事是将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)
我知道的最常见的做法是使用带有冲突控制的哈希算法,只需使用某种快速单向编码即可在URL上产生非常低的冲突。
尝试切掉你知道所有URL中都相同的部分(即HTTP://、www等...),如果这些URL都属于你的域名,也将其切掉。
否则,我会重新思考问题,并尝试找到不同的方法来完成你想要完成的任务。我认为拥有一组唯一的URL实际上是在解决其他问题。