我有一些带有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
,但您知道哪些不同的方式?
也许我应该尝试使用其他数据库?
答案 0 :(得分:3)
它最初是作为评论但不适合所以我将其作为答案发布。正如其他人已经指出的那样,在列上使用索引来搜索或排序任何内容。总是。不仅在这个例子中。
如果还不够,那么请考虑使用Redis等其他数据存储来处理您的特定用例。