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 和大量查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 选择查询与连接和大量的结果优化

mysql如何批量查询大量数据

PHP查询MySQL大量数据的内存占用分析

提供大量数据的查询的最佳 MySQL 设置?

优化 SQL 查询以从大量 MySQL 数据库中获取数据

优化 MySQL 查询以避免扫描大量行