mysql(6)
-
[MySQL] AUTO_INCREMENT 값 순차적 일관성 검증
개요비즈니스 로직 작성 중 bulk insert 이후 모든 레코드에 대해 update를 수행해야 할 필요가 생겼다.개별 데이터에 대해 단일 쿼리문을 실행하면 로직 작성은 편하겠으나 성능이 떨어질 거 같았다. 따라서 Bulk Insert 이후에 id값을 활용하여 update를 해야하는데 여기서 삽입된 레코드들에 대한 Auto increment의 값이 과연 순차적임을 보장하는지에 대한 궁금증에서 비롯된 실험을 공유하고자 한다. 우선 필자의 MySQL은 별도의 튜닝없이 default setting만 가지며 엔진은 InnoDB 를 사용했음을 고려하고 봐줬으면 한다. MySQL의 Auto increment를 핸들링하는 세가지 방법https://dev.mysql.com/doc/refman/8.4/en/innodb..
2024.12.31 -
[MySQL] 대화형 연결과 비대화형 연결(interactive connection, noninteractive connection), Packet out of order 에러 해결
개요 Node환경에서 mysql 라이브러리를 사용하여 트랜잭션을 수행할 때 발생한 에러에 대해 알아보고 해결방법에 대해 알아본다. 문제 상황Mysql 라이브러리를 사용하는데 디버깅을 할때마다 Packet out of order 에러가 발생했다.뿐만 아니라 로직이 조금 오래 걸리는 비즈니스 로직을 작성했는데 디버깅 과정에 있지 않더라도 에러가 발생하였다.라이브러리에서 throw하는 에러의 message 내용은 다음과 같았다.Cannot enqueue Query after fatal error. 사용중인 라이브러리의 커넥션이 실행되는 부분에는 다음과 같이 설정돼있었다.connection.on('connection', function (connection) { connection.query('SET SES..
2024.12.04 -
[ Node ] Mysql 라이브러리에서 Sql Injection 예방을 위한 파라미터 바인딩
개요사내 데이터베이스는 MySQL을 사용하고 있고 Node를 사용하고 있기 때문에 node-mysql 라이브러리를 사용하고 있다.그러던 중 문득 우리 서버는 SQL Injection으로부터 안전한지 궁금해져 글을 쓰게 됐다. SQL Injection이란?SQL injection은 말 그대로 쿼리문에 sql 명령어를 삽입하면 명령어가 그대로 실행되는 취약점을 노린 보안 공격이다.예를 들어 다음과 같은 것이 가능하다. const name = req.body.name;const sql = "select * from user where name=" + namedb.query(sql, function(response,err){ ...}) 이 때 클라이언트에서 다음과 같이 요청(request) 페이로드를 전달하..
2024.07.17 -
[RDBMS] DB의 쿼리 실행 과정에 대해서
일반적으로 DB를 사용할 때 초보 입장에서는 문법에 맞게 sql문만 사용하면 된다고 생각한다. 그러나 DB에 대한 기초이론도 탄탄해야한다. 따라서 이번 글에서는 DB에 SQL문을 실행할 때 어떤 과정으로 진행되는지, db 내부적으로 시스템이 어떻게 가동되는지에 대해 정리해보고자 한다. * 해당 글에는 정확하지 않은 정보가 있을 수 있으므로 더 자세한 정보는 공식문서나 해외 포럼을 참고하시고 잘못된 부분을 댓글로 지적해주시면 수정하겠습니다. 목차는 다음과 같다. 1. SQL 파서의 구문 분석 2. 옵티마이저의 쿼리 최적화 3. 로그 관리(redo 로그와 undo 로그) 4. 트랜잭션에 관해 4-1. 정합성과 무결성 4-2. 동시성 제어 (동시성 제어, 고립성 레벨, 데드락) 4-3. 성능 최적화 1. SQ..
2024.02.02 -
[MySQL] group by에서 최대값을 가진 row들을 가져오기
테이블에서 최대값을 구하기 위해서는 집계함수를 써야 하는데 이 때 집계함수는 select문에서 사용 가능하다. 최대값만 가져오는 건 쉽지만 최대값을 가진 row를 불러오는 것은 또 다른 문제이며 group by에서 여러개의 그룹에서 각 column에 해당하는 최대값 row들을 불러오는 것은 또 다른 문제이다. 쉬운 것부터 확인해보자 1. 특정 column에서 최대값을 가진 table의 row 가져오기 다음과 같은 테이블이 있을 때 가장 비싼 가격을 가진 물건을 가진 id와 물건의 이름을 가진 row를 가지고 오고 싶다면 어떻게 해야할까? 1. 서브쿼리를 사용하던지 2. 가격을 내림차순으로 정렬한 후 첫번째 row를 가지고 오면된다. # 1번 방법 select * from post1 where price ..
2023.05.26 -
[MySQL] foreign key(외래키) 사용법
MySQL에서는 제약 조건이라는 것이 있다. 데이터를 저장할 때 특정 조건에 해당하는 데이터만 레코드에 집어넣을 수 있게 설정하는 것이다. 대표 제약 조건으로 NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, DEFAULT가 있다. 여기서는 주제에 맞게 FOREIGN KEY만 다루겠다. FOREIGN KEY는 여러 테이블에 서로 공통된 값을 참조할 수 있도록 도와준다. table1과 table2가 있을 때 table1에서의 id값을 다른 테이블에서도 사용하고 싶을 수 있다. 예를 들어 다음과 같이 테이블이 있다고 해보자. 이 때 table1의 id1값을 table2에서 참조하고 싶어한다. 즉 table2의 id(id2)값은 외래키로 지정하고 싶다면 위와 같이 작성한다. tab..
2023.05.26