我正在对维基百科的页面数据进行一些测试。这包括大约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 。
答案 0 :(得分:0)
正如@Cyrus建议的那样,你需要一个索引。
ALTER TABLE pagecount ADD KEY (article);
然后再次尝试查询。
在进行基准测试时,您应该使用SELECT SQL_NO_CACHE ...
来避免看到的查询时间比服务器始终如一地快得多。