約 900,000 レコードのバケットがあります。これらのレコードの大部分は、セカンダリ インデックスで PERSISTED のステータスを持っています。すべての base_url と、PERSISTED とマークされたすべてのドキュメントの各 base_url に属するドキュメントの数を取得したいと考えています。
クエリは次のとおりです。
curl -X POST -H "content-type: application/json" \
http://localhost:8098/mapred?chunked=true --data @-<<\EOF
{
"timeout":600000,
"inputs":{
"bucket":"test-bucket",
"index":"status_bin",
"key":"PERSISTED"
},
"query":[{
"map":{
"language":"javascript",
"source":"
function(value, keyData, arg) {
var data = Riak.mapValuesJson(value)[0];
var obj = {};
obj[data.base_url] = 1;
return [obj];
}
"
}
},
{
"reduce":{
"language":"javascript",
"source":"
function(values, arg){
return [values.reduce(
function(acc, item){
for(var base_url in item){
if(acc[base_url]) {
acc[base_url] = acc[base_url] + 1
} else {
acc[base_url] = item[base_url];
}
}
return acc;
})
];
}
"
}
}]
EOF
これは 10 分後にタイムアウトします。
20Gb のメモリを搭載した 16 コアの 3Ghz AWS ノードを使用しています。
構成または上記のクエリのいずれかで、間違っている可能性がありますか?
そんなに時間がかかるのでしょうか?
全体像を示すために、MySQL での同等のクエリは次のようになります。
SELECT COUNT(*), カタログ FROM urls GROUP BY カタログ;
試したことはありませんが、MySQL では、900,000 レコードを超える上記のクエリの結果セットに数秒かかると思われます。Riak と MySQL を比較するつもりはありません。なぜなら、それらは大きく異なっているからです。しかし、少なくとも上記のクエリを 10 分以内に実行するにはどうすればよいか疑問に思っています。
ありがとう!