insert를 쿼리 한번에 로우 하나로 처리하시지 마시고, 쿼리 한번에 500~1000개씩 밀어넣는 방식으로 변경해보세요.
csv 파일 전체를 node 내에서 로드한 다음 500~1000 라인씩 chunk 처리하고, 청크로 묶인 데이터를 루프돌면서 insert 하면 됩니다.
500개씩만 묶어도 10만개 데이터는 루프 200번만에 처리 가능합니다.
스트림으로 읽으면서 db 쿼리 10만번 날리는 것 보다 한번에 읽어서 처리하는게 부하가 더 적고 빠를거에요.
node 8 버전 이상은 async, await을 지원하니 async function 으로 생성해서 호출하면 순차적으로 쿼리 실행되게 만들기가 쉬울 것 같습니다. 8 버전 미만이면 babel-node 써서 실행시키면 되구요.
대충 아래 같은 로직으로 처리하면 될 것 같아요.
// TODO: csv 파일 읽기, chunk 처리
const chunkedItems = [[{ id, name, desc }, '...499개'], ['...500개'],];
const run = async () => {
// 500개 데이터 밀어넣기
for (let items of chunkedItems) {
await dbInserts(items);
}
};
run()
.then(() => console.log('finished!'));