在节点中处理大量数据的最快方法

时间:2017-03-30 14:55:23

标签: javascript mysql node.js performance npm

我有一些带有4 000 000个数字的数据库,我需要检查数据库中是否存在某个数字

数据库exapmle:[177,219,245,309,348,436,...]

我尝试使用mysql表,但检查是否存在 1 数字需要 1300ms

很长一段时间我会检查另一种方式:

1)将所有数字推到array并使用indexOf

进行检查

2)将所有数字推到string并使用indexOf

进行检查

3)将所有数字推到object并使用hasOwnProperty

进行检查

4)将所有数字推到object并检查值

我已经用所有这些方式进行了100次检查并测量了时间:

try [...].indexOf(...) === 0
Total: 726ms

try String(...).indexOf(...) === 0
Total: 1915ms

try {...}.hasOwnProperty(...) === true
Total: 4ms

try {...}[...] === true === true
Total: 4ms

测试代码:

// Reads db json with ~4 000 000 elements
var arr = utils.readJSON('members.json');
// Converts db to string type
var arr_string = arr.toString();
// Makes empty object
var arr_obj = {};
// Converts db to object type
for(var i in arr){
    arr_obj[arr[i]] = true;
}
// Makes empty array
var checkList = [];
// Gets 100 different values from different places of db
for(var i = 0; i < 100; i++){
    checkList.push(arr[Math.floor(arr.length / 100 * i)]);
}
// Main time variable
var time;

// test
time = new Date().getTime();
for (var i in checkList) {
    console.log('try [...].indexOf('+ checkList[i]+') === ' + arr.indexOf(checkList[i]));
}
console.log('Total: ' + (new Date().getTime() - time) + 'ms');

// test
time = new Date().getTime();
for (var i in checkList) {
    console.log('try String(...).indexOf(' + checkList[i] + ') === ' + arr_string.indexOf(checkList[i]));
}
console.log('Total: ' + (new Date().getTime() - time) + 'ms');

// test
time = new Date().getTime();
for (var i in checkList) {
    console.log('try {...}.hasOwnProperty(' + checkList[i] + ') === ' + arr_obj.hasOwnProperty(checkList[i]));
}
console.log('Total: ' + (new Date().getTime() - time) + 'ms');

// test
time = new Date().getTime();
for (var i in checkList) {
    console.log('try {...}[' + checkList[i] + '] === true === ' + (arr_obj[checkList[i]] === true));
}
console.log('Total: ' + (new Date().getTime() - time) + 'ms');

我认为执行此任务的最佳方式是Object hasOwnProperty,但您知道哪些不同的方式?

也许我应该尝试使用其他数据库?

1 个答案:

答案 0 :(得分:3)

它最初是作为评论但不适合所以我将其作为答案发布。正如其他人已经指出的那样,在列上使用索引来搜索或排序任何内容。总是。不仅在这个例子中。

如果还不够,那么请考虑使用Redis等其他数据存储来处理您的特定用例。