为什么 MongoDB 和 MySQL 比 grep 慢?
Why is MongoDB and MySQL slower than grep?
我正在对维基百科的页数数据进行一些测试。这包括大约 700 万行,如下所示:
es London 13 173367
第 3 列是计数,我想对具有相同名称(第 2 列)的文章求和。所以,在命令行上:
paste -sd + <(grep ' London ' pagecounts | cut -d ' ' -f 3) | bc
效果很好,需要 0.53s
我认为使用数据库查询信息会更快,所以我将其全部加载到MongoDB数据库中,然后:
db["pagecounts"].aggregate({
$match: { "article": "London" }
}, {
$group: { _id: "London", "total": { $sum: "$count" } }
});
这有效,但需要 8.96s
困惑和失望,我转向MySQL:
SELECT SUM(count) FROM pagecounts WHERE article='London';
用了 5.08s
我不太了解数据库的内部结构,但我不认为像 grep
这样的命令行工具在这种事情上会更快。这是怎么回事?还有什么可以改进的?
更新
正如 Cyrus 和 Michael 所建议的,创建和索引使这种方式更快:~0.002s.
正如@Cyrus 所建议的,您需要一个索引。
ALTER TABLE pagecount ADD KEY (article);
然后重试查询。
在进行基准测试时,您应该使用 SELECT SQL_NO_CACHE ...
以避免发现查询时间看似比服务器持续交付的速度更快。
我正在对维基百科的页数数据进行一些测试。这包括大约 700 万行,如下所示:
es London 13 173367
第 3 列是计数,我想对具有相同名称(第 2 列)的文章求和。所以,在命令行上:
paste -sd + <(grep ' London ' pagecounts | cut -d ' ' -f 3) | bc
效果很好,需要 0.53s
我认为使用数据库查询信息会更快,所以我将其全部加载到MongoDB数据库中,然后:
db["pagecounts"].aggregate({
$match: { "article": "London" }
}, {
$group: { _id: "London", "total": { $sum: "$count" } }
});
这有效,但需要 8.96s
困惑和失望,我转向MySQL:
SELECT SUM(count) FROM pagecounts WHERE article='London';
用了 5.08s
我不太了解数据库的内部结构,但我不认为像 grep
这样的命令行工具在这种事情上会更快。这是怎么回事?还有什么可以改进的?
更新
正如 Cyrus 和 Michael 所建议的,创建和索引使这种方式更快:~0.002s.
正如@Cyrus 所建议的,您需要一个索引。
ALTER TABLE pagecount ADD KEY (article);
然后重试查询。
在进行基准测试时,您应该使用 SELECT SQL_NO_CACHE ...
以避免发现查询时间看似比服务器持续交付的速度更快。