我做了一个webcrawler,它在数据库中插入了各种页面和链接。目前,已抓取的URL的域是页面和链接表中的属性。
我正在考虑为域创建一个表,但我担心这会减慢插入速度。
目前,我已经下载了1,200,000个链接,数据库中有70,000个页面,这将会增加。
有什么更好的解决方案?创建域表?在域属性中创建一个索引(它是一个varchar)?
PS:我开发的其他程序将在此数据库中执行查询。
答案 0 :(得分:1)
如果我理解正确,你有两个表:“链接”和“页面”。你对这些表中的字段一无所知。更多信息会很好。
无论如何,完全规范化的数据库往往会侵蚀性能。我建议将域保存为两个表中的属性。一点冗余可能会提高您的表现。
还有一个建议,而不是拥有一个数据库,您可能希望有两个:一个仅用于插入和更新;另一个用于只读访问(选择)。
在第一个数据库中删除所有索引和约束。这将为您提供快速插入/更新操作。
在只读数据库中,正确设计索引以使检索操作更快。
当然,您需要以某种方式同步两个数据库。这可能需要一些额外的编码。
答案 1 :(得分:0)
你可能需要做一些游戏,看看你从不同的方法得到什么样的结果。你有多少个不同的域名?
请记住,如果在域属性上创建索引,它实际上会减慢插入速度。索引有助于提高选择性能,但它们会降低更新/删除/插入操作的速度,因为它是需要更新的额外内容。
如果数量相对较少,我会亲自将这些域名放在单独的表格中。
答案 2 :(得分:0)
我不明白为什么你不会正常化
当然,这会稍微影响插入的性能,但我希望瓶颈(和/或限制)将处于页面下载的级别。如果不是这种情况,这表明你 打击了互联网 ! ;-)
典型的爬虫[当然是大型SE使用的那些],即使在多线程甚至多台机器上运行时,也只能以每秒几十页的速度和持续的方式生成,这远低于大多数DBMS的能力服务器,即使有一点争用。
还有人会期望域表格相对较小且经常访问,主要是阅读,因此通常会被缓存。
在
的情况下,我只考虑非规范化和其他技巧答案 3 :(得分:0)
假设您的数据库设计是这样的:
Page:
Id | URL
Link:
Id | Page_Id | URL
如果有很多重复使用的网址(比如TVTropes),我很可能会将设计重新格式化为:
Domain:
Id | URL
Page:
Id | URL_Id
Link:
Id | Page_Id | URL_Id
当你去做你的数据挖掘时,我会推荐一个关于URL的索引,以及所有常用的索引。
如果空间成为一个问题(超过插入或检索时间),并且您的网址(深层文件夹结构)有很多级别,您可以试试这个 -
Domain:
Id | Parent_Id | URL_Part
Page:
Id | URL_Id
Link:
Id | Page_Id | URL_Id
这当然需要一个递归查询来组装URL,但是数据挖掘的前景非常广泛。如果不了解更多关于你的实际设计(和你的预期用途)的话,我真的无法提出更多的建议。