我正在对维基百科的页数数据进行一些测试。这由大约 700 万行组成,如下所示:
es London 13 173367
第三列是计数,我想对具有相同名称的文章(第二列)进行求和。因此,在命令行上:
paste -sd + <(grep ' London ' pagecounts | cut -d ' ' -f 3) | bc
效果很好,需要 0.53 秒
我认为使用DB来查询信息会更快,所以我将其全部加载到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 ...
以避免看到查询时间比服务器持续交付的速度更快。
关于mysql - 为什么 MongoDB 和 MySQL 比 grep 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29469745/