[TIL] 대용량 INSERT 처리하기

유현영·2020년 6월 14일
0

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

매번 비교하여 데이터를 뿌려주기에는 너무 많은 낭비라서 전화번호 목록에 있는 핸드폰번호와 앱 유저를 일주일에 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개의 댓글