async function combinedMethod() {
const batchSize = 100000; // 每次查询的批量大小
const startId = 49904812;
const endId = 133784381;
const totalIterations = Math.ceil((endId - startId + 1) / batchSize);
for (let i = 0; i < totalIterations; i++) {
const batchStartId = startId + i * batchSize;
const batchEndId = Math.min(batchStartId + batchSize - 1, endId);
const users = await this.userservice.find({
where: {
id: Between(batchStartId, batchEndId),
},
});
const promises = users.map(async (user) => {
const courtProvinceId = await getCourtProvinceId(user.court_province);
const courtCityId = await getCourtCityId(user.court_city);
if (courtProvinceId) {
user.court_province_id = courtProvinceId;
await this.userservice.save(user);
}
if (courtCityId) {
user.court_city_id = courtCityId;
await this.userservice.save(user);
}
});
await Promise.all(promises);
}
}
async function getCourtProvinceId(courtProvince) {
const courtProvinces = await this.authser.find({
where: {
name: `${courtProvince}省`,
},
});
if (courtProvinces.length > 0) {
return courtProvinces[0].code;
} else {
return null;
}
}
async function getCourtCityId(courtCity) {
try {
const courtCityData = await this.authser.findOne({ where: { name: courtCity } });
if (courtCityData) {
return courtCityData.code;
} else {
return null;
}
} catch (error) {
// 处理错误
return null;
}
}
你的问题主要是在数据库的查询和保存操作的方式,而不在于 Node.js 的单线程模型,有几个点你可以优化:
1.批量保存,
2.你可以预加载courtProvince 和 courtCity
3.优化数据库查询
async function combinedMethod() {
const batchSize = 100000; // 每次查询的批量大小
const startId = 49904812;
const endId = 133784381;
const totalIterations = Math.ceil((endId - startId + 1) / batchSize);
const provinceMap = new Map();
const cityMap = new Map();
for (let i = 0; i < totalIterations; i++) {
const batchStartId = startId + i * batchSize;
const batchEndId = Math.min(batchStartId + batchSize - 1, endId);
const users = await this.userservice.find({
where: {
id: Between(batchStartId, batchEndId),
},
});
for (const user of users) {
if (!provinceMap.has(user.court_province)) {
const courtProvinceId = await getCourtProvinceId(user.court_province);
provinceMap.set(user.court_province, courtProvinceId);
}
user.court_province_id = provinceMap.get(user.court_province);
if (!cityMap.has(user.court_city)) {
const courtCityId = await getCourtCityId(user.court_city);
cityMap.set(user.court_city, courtCityId);
}
user.court_city_id = cityMap.get(user.court_city);
}
await this.userservice.save(users);
}
}
async function getCourtProvinceId(courtProvince) {
const courtProvinces = await this.authser.find({
where: {
name: `${courtProvince}省`,
},
});
if (courtProvinces.length > 0) {
return courtProvinces[0].code;
} else {
return null;
}
}
async function getCourtCityId(courtCity) {
try {
const courtCityData = await this.authser.findOne({ where: { name: courtCity } });
if (courtCityData) {
return courtCityData.code;
} else {
return null;
}
} catch (error) {
// 处理错误
return null;
}
}
查询可以合并为一次查询,后续的操作和保存似乎不影响其他数据,用promiseAll处理一下
如何将两个方法合并成一个方法 如图parentValues = ['BC', 'BC-SRV', 'BC-SRV-COM'], 想得到的是选中的树组arrSelectedFacets = ['BC-SRV-COM-FTP', 'BC-SRV-COM-TEL'] 如果 BC-SRV-COM 下的子节点都选中,则arrSelectedFacets=['BC-SRV-COM']
nestjs 使用 prisma 如何使用 @nestjs/config 进行配置数据库?
如何在PHP Smarty中优化这段代码? 现在我有一个代码让我困惑,有一个简单的代码。 当我搜索需要推送值的代码时。 优化如何发挥作用?我能写到数组吗?如果它可以写入数组,我该怎么办?
比如: 相似度很高,但逻辑顺序不能变,这种能优化吗?
统计数据表中多个sum千万级数据超时。由于业务需要实时 所以做不来快照表 我加了索引似乎也不管用 后来为了不联表 我直接把快照写入进去了
我认为代码(如下)已经优化(只需使用比相同逻辑的初始版本更少的变量) > 在优化过程中,我应该考虑哪些因素? 这是代码(也在jsfiddle上) 这是代码的解释。“处理”函数在数组中查找相同的值,对于每个相同的值,它通过将一个数字挂起到该值来更改值,“数字”表示它在数组中找到的值的计数。 例如arr=["x","x","y","z"]将返回["x(1)","x(2)","y","z"]"y"和"z