在数据库中存储数百万个URL以实现快速模式匹配

时间:2010-06-05 18:23:18

标签: mysql database architecture url

我正在开发一种网络分析类型的系统,需要为网站上的每个访问者记录引用网址,着陆页网址和搜索关键字。我想用这些收集的数据做的是允许最终用户查询数据,例如“显示所有来自Bing.com的访客搜索包含'红鞋'的短语”或“显示所有登陆的访客”在包含'campaign = twitter_ad'“等的网址上

由于该系统将在许多大型网站上使用,因此需要记录的数据量将会非常快速增长。所以,我的问题是:a)什么是最好的记录策略,以便扩展系统不会成为痛苦; b)如何使用该架构快速查询任意请求?是否有一种特殊的存储URL方法,以便查询它们更快?

除了我使用的MySQL数据库之外,我正在探索(并开放)更适合此任务的其他替代方案。

3 个答案:

答案 0 :(得分:2)

为了快速搜索数据存储,我建议创建一个基于后缀树数据结构的url(或任何其他基于字符串的标准)的索引。搜索将在O(k)中完成,其中k是url的长度(非常快)。你可以找到here这种树的好介绍。

在记录时,尽量不要将它们存储起来。 I / O操作是非常耗费资源的,并且在大多数情况下是这种系统的瓶颈。尝试批量将URL写入数据存储。例如,将提交的URL保留在内存中,并一次只存储1000个块。只需记住在某些后台或计划任务上更新后缀树以保持数据同步。

答案 1 :(得分:0)

我在SQL Server中遇到了这个确切的问题,我的解决方案是一个表,用于在包含URL和TITLE校验和的两个计算列上存储所有唯一的URL / TITLES和唯一键。它占用了大约十分之一的空间作为字符串URL / Title的等效键。并且比直接索引快10倍。

我正在使用SQL服务器,因此声明是

(checksum([URL],(0)))

(checksum([URL],(0)))

我为MySql找到了this

由于大多数流量来自许多相同的网站,因此它允许我整合网址/标题,而无需使用每个插入搜索整个表来强制执行唯一约束。如果已经存在,我的程序只返回了一个url / title PK。

要绑定到您的用户,请使用USER_URL表格,其中包含用户名和网址PK的FK。

祝你好运。

答案 2 :(得分:0)

我希望mysql上有一个URI的数据类型。但是既然oracle有它并且mysql现在是oracle,那么有一天可能会发生......

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements001.htm#i160550