MySQL(9)
-
호텔 데이터 마이그레이션 최적화 - 인덱스 & UPSERT
들어가며: 호텔 표준 데이터 최신화의 시작"36GB의 호텔 데이터 마이그레이션 해주세요."호텔 표준 데이터 최신화 프로젝트에서 마주한 첫 번째 과제였습니다. 호텔 데이터는 단순한 flat한 구조가 아닌, 6개의 테이블로 분산되어 저장되어야 했습니다:제가 생각한 이 마이그레이션의 핵심 요구사항은 "데이터 정합성"이었습니다. 하나의 호텔 데이터가 이 6개 테이블에 모두 성공적으로 저장되거나, 아니면 전혀 저장되지 않아야 했습니다("All or Nothing").또한 기존 데이터가 있을 수 있어 INSERT가 아닌 UPSERT를 사용해야 했죠.메모리 한계를 고려해 batch size를 100으로 설정했습니다. 36GB 전체를 한 번에 처리하는 것은 현실적으로 불가능했고, 실패 시 복구도 용이해야 했기 때문입니..
2025.02.16 -
CTE: 장점과 단점, 그리고 가독성 문제에 대한 고찰
💡 본 글은 회사에서 CTE(Common Table Expression) 를 처음보고, 이에 대해 조사해본 글입니다!💡 CTE 문법은 ANSI 표준 중 일부라, 대부분의 DBMS 에서 지원하지만, 내부적으로 동작을 하는 방식은 DBMS 마다 다르니, 참고하세요! (ex. Postgre 에서 CTE는 무조건 Using Temp 지만, MySQL 은 Execution Plan 에 따라 다릅니다! )CTE 의 기본 개념A common table expression (CTE) is a named temporary result set that exists within the scope of a single statement and that can be referred to later within that st..
2024.07.16 -
손흥민 결승골 후 데이터 폭증: 해축갤에서의 3가지 인덱스 전략
배경 최근 이런 시나리오를 생각해봤습니다. 월드컵 결승에서 손흥민 선수의 골로 인해 극적인 승리를 한다면 해축갤에 무슨 일이 일어날까? (제발 이런 일이 일어났으면) 생각만 해도 달달하다. 이런 경우 아마 해축갤에 흥민찬양에 대한 주제로 글이 미어터질 것입니다. 이렇게 생성된 글들이 쌓이면, 이는 결국 대규모 데이터라고 불릴 만큼 늘어날 것입니다. 그리고 저는 늘어난 글의 갯수를 대략 1억개로 잡아봤습니다. 그래서 최근 데이터를 200만 개에서 1억 개로 늘리고 난 뒤 기존 API의 성능이 얼마나 나오는지 궁금해 쿼리를 한번 테스트해 봤습니다. 정신 나갔다,,, 쿼리 응답시간 4분 20초…? 해축갤은 제 자식과 같은 프로젝트이지만, 저라도 이 서비스는 사용하지 않을 거 같습니다 ㅠ 상황 현재 해축갤의 E..
2024.03.26 -
MySQL 인덱스 크기와 디스크 I/O 최적화: 데이터베이스 성능 향상 가이드
배경 해축갤 프로젝트를 하며 데이터가 200만개에서 1억개로 늘어났을 때 게시물 조회 성능이 급격히 안 좋아져 쿼리 개선, title, content 기준 인덱스를 이것저것 넣어보며 실험을 하고 있었습니다. 인덱스중 title, content 2개를 가지고 B-Tree 인덱스를 생성하려 했다가 문제가 발생했습니다. 구체적인 상황 (like DB, 코드 구조) 해축갤의 게시글 테이블의 구조는 다음과 같습니다. 주의해서 봐야 하는 부분은 content 가 varchar(1000) 라는 겁니다. 제가 사용하는 MySQL 버전은 8.0.36 이고 입력한 명령어는 다음과 같습니다. CREATE INDEX idx_title_content ON post (title(100), content(100)); 문제 위 쿼리..
2024.03.25 -
MySQL 데이터베이스 복구 실패: 실험에서 배운 교훈과 데이터베이스 관리 전략
? DB 가 죽어버렸다. 껐다 켜면 되겠지라는 생각으로 다음 명령어를 쳤는데 brew services restart mysql 여전히 안된다. 원인 분석 그래서 로그를 확인하기 위해 ‘/usr/local/mysql/data/mysqld.local.err’ 을 까보기로 마음을 먹었다. 근데 파일이 자그마치 12MB 나 되는 파일을 일일이 읽는다는 건 비효율적이 판단했다. ERROR 관련 키워드(ex. ‘ERROR’, “Assertion Failure’, ‘crash’) 만 따로 추출해 분석해 보기로 했다. # 로그 파일에서 특정 키워드를 포함하는 부분을 찾아냅니다. keywords = ["ERROR", "Assertion failure", "crash"] matching_lines = [] for line..
2024.01.23 -
H2 console, Access denied for user 'root'@'localhost' (using password: NO) 28000/1045
강의 중에 H2 console로 mariadb에 접속을 해야 하는 일이 있었다. 위와 같이 입력후 `Test Connection` 을 누르니 다음과 같은 에러가 났다. 비밀번호를 입력을 했음에도 불구하고 비밀번호가 틀린것도 아니고 using password: NO 라니 그래서 뭔가 하고 GPT 한테 두드렸더니 버전 문제가 있을수도 있다고 하는 걸 보고 내 build.gradle 파일을 확인해 봤더니 버전이 명시적으로 적혀져 있었다. 내 스프링 부트에 뒤떨어진 버전인가 하고 이렇게 바꾸고 나니, 스프링 부트가 3.1.4. 를 import 해왔고 다시 실행해 보니 아주 잘된다! 결론 비밀번호를 입력해도 값이 넘어가지 않으면 드라이버 버전 호환을 따져보자
2023.10.25