MySQL 和大量查询
Posted
技术标签:
【中文标题】MySQL 和大量查询【英文标题】:MySQL and lots of queries 【发布时间】:2015-04-08 09:43:49 【问题描述】:我有一个 Java 应用程序,它是一种网络爬虫。它解析了很多,我们称之为 - 行。关键是,在抓取网页时,检查在某个页面上找到的行是新的还是旧的(此时我对 mysql 数据库进行查询以检查它是否存在于其中)。如果它是新的,我将它放到一个单独的数组中并执行另一个查询以将该行添加到数据库中,因此在进行下一次抓取时,该行可以被识别为旧行。问题是,该网页大约有 90,000 行这样的行,并且性能很慢。有时 MySQL 服务器甚至崩溃。
我想听听你的意见,我应该选择以下哪个选项(或者其他选项):
-
选择其他 DBMS,如 MongoDB 或其他?
不要将行放入数据库,而是使用一些缓存解决方案? (那有什么解决方案呢?)
非常感谢!
【问题讨论】:
你能告诉我们你的代码吗?这样也许能给你一个更好的答案 【参考方案1】:您可以使用 Apache Cassandra 代替 mysql。它的写入速度很快,您不需要缓存。如果在应用程序级别使用散列函数定义适当的唯一键,则可以避免先读后写,这样如果您在相同的旧页面和新页面上应用散列,它将产生相同的唯一键。你总是插入你不必阅读。
您也可以进行条件插入,但这会降低写入吞吐量,因为它必须对所有副本进行 paxos 共识。
【讨论】:
【参考方案2】:在内存中保存两个列表:
已经访问过的页面 待访问页面现在算法是这样的:
-
阅读要访问的页面
从该页面和每个链接中提取链接
如果已经访问过的页面中存在链接,则丢弃它
如果要访问的页面中存在链接,则丢弃它
如果在已访问页面和待访问页面中不存在,则访问数据库并进行搜索。如果存在丢弃它。如果不存在,则在数据库和内存列表中将其添加为要访问的页面。
从要访问的页面中删除当前页面并将其添加到已访问的页面中
在此解决方案中,您将很少访问数据库。考虑将两个列表的大小限制在一个合理的维度,以解决内存错误的问题。
【讨论】:
以上是关于MySQL 和大量查询的主要内容,如果未能解决你的问题,请参考以下文章