我有一些带有 4 000 000 个数字的数据库,我需要检查数据库中是否存在某些数字
数据库示例:[177,219,245,309,348,436,...]
我尝试使用 mysql 表,但它需要 1300ms 来检查是否存在一些 1 数字
时间很长,我检查了一些其他方法:
1) 将所有数字推送到array
并使用indexOf
进行检查
2) 将所有数字推送到string
并使用indexOf
进行检查
3) 将所有数字推送到对象
并使用hasOwnProperty
检查它
4) 将所有数字推送到对象
并检查值
我以所有这些方式进行了 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');
我相信执行此任务的最佳方法是使用 hasOwnProperty
的 Object
,但是您知道哪些不同的方法?
也许我应该尝试使用其他数据库?
最佳答案
它最初是评论,但不合适,所以我将其作为答案发布。正如其他人已经指出的那样,在要搜索或排序的列上使用索引。总是。不仅在这个例子中。
如果这还不够,请考虑使用其他一些数据存储,例如 Redis,它可能更有效地处理您的特定用例。
关于javascript - 在 Node 中处理大量数据的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43121396/