【问题标题】:Storing millions of URLs in a database for fast pattern matching将数百万个 URL 存储在数据库中以进行快速模式匹配
【发布时间】:2011-02-28 05:15:50
【问题描述】:

我正在开发一种网络分析系统,它需要记录网站上每个访问者的引用 URL、登录页面 URL 和搜索关键字。我想要对收集到的数据执行的操作是允许最终用户查询数据,例如“显示所有来自 Bing.com 的搜索包含“红鞋”的短语的访问者”或“显示所有登陆的访问者”在包含“campaign=twitter_ad”等的 URL 上。

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

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

【问题讨论】:

    标签: mysql database architecture url


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      我使用的是 SQL server 所以语句是

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

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

      我为 MySql 找到了 this

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

      要绑定到您的用户,请使用带有 USER 和 URL 的 PK 的 FK 的 USER_URL 表。

      祝你好运。

      【讨论】:

      • 感谢您的建议。虽然校验和策略可能对我不起作用,因为我可能需要进行模式匹配,例如:搜索所有包含 campaign=twitter 的 URL
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-12-30
        • 2012-05-05
        • 2016-11-15
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多