[TIL] 대용량 INSERT 처리하기

유현영·2020년 6월 14일

사용자의 핸드폰에 있는 전화번호 목록을 받아와서
앱의 유저와 비교하여 친구인지, 비회원인지, 회원인지 비교를 해야하는 과제가 주어졌다.

매번 비교하여 데이터를 뿌려주기에는 너무 많은 낭비라서 전화번호 목록에 있는 핸드폰번호와 앱 유저를 일주일에 1번만 비교하여 테이블에 저장해 놓고 요청할 때마다 해당 테이블의 정보를 보내주는 식으로 처리하려 하니 어떻게 해야 빠르게 INSERT 할 수 있을지 찾아보았다.

1. INSERT 여러번

기존의 방식대로

INSERT INTO table_name (1, 2, 3) VALUES (1, 2, 3);
INSERT INTO table_name (1, 2, 3) VALUES (3, 4, 5);
INSERT INTO table_name (1, 2, 3) VALUES (6, 7, 8);

2. BULK INSERT

values 리스트를 다중으로 사용하면 성능을 향상시킬 수 있다.

INSERT INTO table_name (1, 2, 3) VALUES (1, 2, 3);

단, 사이즈 제한이 있기에 설정에서 max_allowed_packet을 조정해주어야 한다.
mysql 링크

3. Transaction 처리

BIGIN;
INSERT INTO table_name (1, 2, 3) VALUES (1, 2, 3);
INSERT INTO table_name (1, 2, 3) VALUES (3, 4, 5);
INSERT INTO table_name (1, 2, 3) VALUES (6, 7, 8);
COMMIT;

실제 비교 사례 링크

nods.js 에서 다중쿼리 처리하기

데이터베이스 연결

import mysql from 'mysql';
//데이터 베이스 기본 연결
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'username',
    password: 'super_secure_password',
    database: 'database_name'
});

connection.connect((error) => {
    if (error) {
        console.error(error);
    } else {
        console.log('connection successful');
    }
});



// 예제 INSERT 문
connection.connect((error) => {
    if (error) {
        console.error(error);
    } else {
        let query = 'INSERT INTO user (name, age, occupation) VALUES (?, ?, ?);';
		let params = ['fred', 34, 'car sales'];
		connection.query(query, params, (error, result) => {
			// inserted row -> 1
		});
    }
});

다중 삽입 기능

connection.connect((error) => {
    if (error) {
        console.error(error);
    } else {
        let query = 'INSERT INTO user (name, age, occupation) VALUES ?;';
		let params = [
			['fred', 34, 'car sales'],
			['john', 21, 'gardner'],
			['peter', 17, 'postman'],
			['rob', 55, 'engineer']
		];
		connection.query(query, [params], (error, result) => {
			// inserted rows -> 4
		});
    }
});

참고링크1
참고링크2

profile
오늘보다 더 나은 내일

0개의 댓글