Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Mysql中存储URL最有效的方法是什么?_Mysql - Fatal编程技术网

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

在Mysql中存储URL最有效的方法是什么?,mysql,Mysql,我想在MySql中存储大量URL,并在列上创建一个唯一的索引。如果我使用utf8列,那么我将被限制为一个varchar(333),它不足以保存我的一些URL。如果我将列声明为latin1,那么我将得到完整的1000个字符(我想我不需要那么多)。但是,我必须对URL进行编码,并且始终使用编码的URL。有没有更好的方法来管理大型URL集?我所知道的最常见的做法是使用具有冲突控制的哈希算法,只需使用某种快速单向编码,将在URL上产生非常低的冲突 试着切掉你知道在所有URL中都是相同的部分(如HTTP:

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

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

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


否则,我会重新思考问题,试着找到一种不同的方式来完成你想要完成的事情。我认为拥有一组唯一的URL确实解决了一些其他问题。

您可能会考虑的一件事是将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)

这有三个好方法:

1) 使用文本而不是VARCHAR。为了确保唯一性,您还必须创建一个单独的VARCHAR列来存储MD5()或SHA1()散列,并添加唯一索引或主索引。这有一个不幸的后果,即需要额外的磁盘搜索来检索URL,但这取决于您的使用情况

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


3) 我在输入前两个时忘记了第三个。grr…

您对他存储URL的原因做出了可能不正确的假设。可能/不/安全地删除www等。你能举个例子吗?删除http和www后,您可以轻松地重新生成原始URL,这不会影响定义的完整性。。。你能解释一下吗?那是错的。不能保证和引用相同的URL。更不用说和了。鼠标悬停在链接上。无论如何,关键是该网站可以自由赋予www子域特殊的意义。你绝对不应该切掉URL的一部分,因为即使是细微的差异也会给你带来完全不同的页面(即www而不是www),但我确实认为哈希的想法是有价值的。如果你散列一个URL,你所要做的就是说selectwherehash='asdf'来获取URL,这可能比说selectwherescheme='http',host='google.com',port='80',path='/foo'要快得多,效率也更高;但同样,这将取决于表的规范化程度以及散列字符串所需的时间,以确定这是否是最好的方法。您可能希望按照朗内克的建议使用文本字段。我更想说的是“有没有更好的方法来管理大型URL集”,它的副作用还有助于您的URL长度。根据URL的使用方式,您可能还想做的一件事是将主机名分解为主机和域,其中主机表具有返回到域表的domain_键。这可能会使查找域中的所有url变得微不足道。+1,我个人会选择#1(将唯一约束放在url的哈希上,而不是url本身)。因此,我应该为哈希设置另一列,而不是将VARCHAR url列设置为主列。我提出了两个不同的建议。我没说一个比另一个好。您必须选择最适合您的用例的。