2015-04-06 71 views
0

我正在做一些維基百科的頁面數據的測試。這包括約700萬線看起來像這樣:爲什麼MongoDB和MySQL比grep慢?

es London 13 173367

第三列是伯爵,我想跨具有相同的名稱(第2列)的文章總結這一點。因此,在命令行:

paste -sd + <(grep ' London ' pagecounts | cut -d ' ' -f 3) | bc

偉大的工程,並採取0.53s

我認爲使用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這樣的命令行工具在這類事情上會更快。這是怎麼回事?什麼可以改進?

UPDATE

至於塞勒斯和邁克爾建議,建立和指標做出這樣快:〜0.002s

+0

數據庫提供了許多命令行工具沒有的功能。特殊用途工具(grep)在特定任務上勝過數據庫並不奇怪。 – 2015-04-06 10:50:13

+3

嘗試[添加索引](http://dev.mysql.com/doc/innodb/1.1/en/innodb-create-index-examples.html)到mysql數據庫中的「article」列,以避免滿表掃描。 – Cyrus 2015-04-06 11:09:54

+0

同樣適用於MongoDB - 你想索引城市名稱來加快速度。 – wdberkeley 2015-04-07 16:50:51

回答

0

正如@Cyrus所建議的那樣,您需要一個索引。

ALTER TABLE pagecount ADD KEY (article); 

然後再次嘗試查詢。

在進行基準測試時,您應該使用SELECT SQL_NO_CACHE ...來避免查看時間比服務器始終如一地提供更快的欺騙性。