我想在MySql中存储大量URL,并在列上创建唯一索引。如果我将列设置为utf8,那么我将被限制为varchar(333),这不足以容纳我的一些URL。如果我将列声明为latin1,那么我将获得完整的1000个字符(不要认为我需要那么多字符)。但是,我必须对URL进行编码,并且始终与编码后的URL保持一致。有没有更好的方法来管理大量的URL?
发布于 2009-06-17 17:56:08
您可能会考虑将URL的主机名和协议部分存储在单独的表中,并通过键引用它。这对于获取特定主机的所有URLS以及解决字符串长度问题也很有用。
例如:
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)发布于 2009-06-17 21:08:14
有三种很好的方法可以做到这一点:
1)使用文本而不是VARCHAR。为了确保唯一性,您还必须创建一个单独的VARCHAR列来存储MD5()或SHA1()散列,并添加一个惟一索引或主索引。这会产生一个不幸的后果,即需要额外的磁盘寻道来检索URL,但根据您的用例,这可能是可以的。
2)使用VARCHAR和二进制排序规则,并使用COMPRESS()压缩URL。
3)我在输入前两个单词时忘记了第三个单词。嗯..。
发布于 2009-06-17 17:52:18
据我所知,最常见的做法是使用带有冲突控制的散列算法,只需使用某种快速的单向编码,就可以在URL上产生非常低的冲突。
试着去掉你知道在所有urls中都是相同的部分(如HTTP://、www等)如果这些urls都是你的域的一部分,那就把它也砍掉。
否则,我会重新思考这个问题,并尝试找到一种不同的方法来完成你想要完成的任何事情。我假设拥有一组唯一的URL确实解决了一些其他问题。
https://stackoverflow.com/questions/1008563
复制相似问题