代码之家  ›  专栏  ›  技术社区  ›  anon

在MySQL中存储URL最有效的方法是什么?

  •  13
  • anon  · 技术社区  · 15 年前

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

    3 回复  |  直到 11 年前
        1
  •  5
  •   mauris    11 年前

    您可能会想到的一件事是将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
  •  9
  •   longneck    15 年前

    实现这一目标的三个好方法:

    1)使用文本而不是varchar。为了确保唯一性,还必须创建一个单独的varchar列来存储md5()或sha1()哈希,并添加一个唯一索引或主索引。这有一个不幸的结果,即需要额外的磁盘搜索来检索URL,但这取决于您的用例,这可能是正常的。

    2)将varchar与二进制排序规则一起使用,并使用compress()压缩URL。

    3)我打前两个的时候忘了第三个。GRR…

        3
  •  0
  •   Martin Dale Lyness    15 年前

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

    尝试切掉你知道在所有URL中都是相同的部分(例如http://、www等…)。如果URL都是你的域的一部分,切掉它。

    否则,我会考虑这个问题,并尝试找到一种不同的方法来完成你想要完成的任何事情。我认为拥有一组唯一的URL确实可以解决其他一些问题。