본문 바로가기

전체 글36

MySQL 스레드 풀 적용 및 성능 비교 서론이번 포스팅에서는 MySQL에 스레드 풀을 적용시키고 여러 변수에 대해 스레드 풀 적용 전 후 성능을 비교해보겠습니다. MySQL에 스레드 풀 기능 적용MySQL 서버 엔터프라이즈 에디션은 스레드 풀 기능을 제공하지만 MySQL 커뮤니티 에디션은 스레드 풀 기능을 지원하지 않습니다. MySQL 커뮤니티 에디션으로 스레드 풀을 사용하기 위해 알려진 방법은 Percona Server에서 스레드 풀 플러그인 라이브러리를 MySQL 커뮤니티 에디션 서버에 설치해서 사용하는 것입니다. Percona가 무엇인지 생소하실텐데 Percona 공식 사이트에 따르면 "Percona는 온프레미스(on-premises) 및 클라우드 환경에서 MySQL, MongoDB 그리고 PostgreSQL을 위한 세계 수준의 오픈 소.. 2025. 5. 4.
존재하지 않는 레코드에 비관적 락으로 동시성 제어가 가능할까 서론이전에 프로젝트를 진행하면서 동시성 제어를 해야할 필요가 있었습니다. 일반적으로 알려진 동시성 제어 예제들은 테이블에 특정 레코드에 대한 수정에 대해 락을 걸고 동시성 문제를 해결하는 것이었습니다. 하지만 저희의 상황은 달랐습니다. 저희의 동시성 문제는 테이블에 존재하지 않는 레코드를 동시 생성을 제어했어야 했습니다. 당시에는 "SELECT ... FOR UPDATE" 은 이미 존재하는 레코드에만 적용할 수 있을거라고 판단해서 MySQL의 네임드 락과 Redis 분산락을 이용해서 문제를 해결했습니다. 하지만 'Real MySQL' 도서를 읽다보니 InnoDB의 레코드 잠금은 레코드를 잠그는 것이 아닌 인덱스를 잠그는 방식 방식으로 처리됨을 알 수 있었습니다. 그리고 문득 "레코드가 존재하지 않더라도 .. 2025. 5. 2.
MySQL에서 GROUP BY 처리는 어떻게 할까? 서론SELECT 문의 WHERE, ORDER BY 등 여러 절들에서 동작이 제일 모호하게 느껴졌던 것이 GROUP BY입니다. 책에서 예제와 출력 결과를 봤을 때는 대충 이해되는 선에서 '아 그렇구나' 하고 넘어갔지만 정확한 동작에 대해 이해하지 못했습니다. 이번 포스티에서 GROUP BY의 동작 원리에 대해 알아보겠습니다. GROP BY 의 원리에 대해 설명하고 있지는 않지만 GROUP BY 사용에 대해 애매하게 알고 있다 싶으면 MySQL 공식 문서에서 GROUP BY 관한 내용을 읽어보는 것이 좋습니다. 필자 또한 공식문서를 통해 모호했던 GROUP BY 사용에 대해 맥락을 잡았습니다. 다음 링크는 필자가 해석한 MySQL 8.5 버전 공식문 GROUP BY 번역글입니다.https://devnona.. 2025. 4. 30.
[번역] 14.19.3 MySQL Handling of GROUP BY SQL-92 및 이전에서는 GROUP BY 절에 이름이 지정되지 않은 nonaggregated 컬럼을 참조하는 select 리스트(SELECT ... FROM 사이에 명시하는 컬럼 리스트를 말함), HAVING 조건 또는 ORDER BY 리스트의 쿼리는 허용하지 않았습니다. 예를 들어, 다음 쿼리는 select 목록에 nonaggregated name 컬럼이 GROUP BY에 없기 때문에 표준 SQL-92에서 허용하지 않습니다.SELECT o.custid, c.name, MAX(o.payment) FROM orders AS o, customers AS c WHERE o.custid = c.custid GROUP BY o.custid;위 쿼리가 SQL-92에서 가능하게 하려면, name 컬럼은 sel.. 2025. 4. 29.
[도서] Real MySQL : InnoDB 스토리지 엔진 아키텍처 - 질문지 Q. InnoDB가 MySQL 에서 사용할 수 있는 스토리지 엔진과 비교해서 유일한 기능은 무엇인가요?더보기InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공합니다 이 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어납니다. 프라이머리 키에 의한 클러스터링Q. InnoDB 테이블에 프라이머리 키를 설정하면 어떻게 되나요?더보기InnoDB의 모든 테이블은 프라이머리 키를 기준으로 클러스터링되어 저장됩니다. 즉, 프라이머리 키 값의 순서대로 디스크에 저장됩니다. 또 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용합니다. 외래 키 지원Q. MyISAM 스토리지 엔진은 외래 키를 사용할 수 있나요?더보기외래 키에 대한 .. 2025. 4. 26.
[도서] Real MySQL : MySQL 아키텍처 - 질문지 MySQL의 전체 구조Q. MySQL 서버는 크게 무엇으로 구분할 수 있나요?더보기MySQL 서버는 크게 'MySQL 엔진'과 '스토리지 엔진'으로 구분할 수 있습니다.MySQL 엔진은 사람의 머리 역할을 담당하고 스토리지 엔진은 손발 역할을 담당한다고 볼 수 있습니다. Q. MySQL 엔진 주요한 구성 요소로 무엇이 있나요?더보기클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러SQL 파서전처리기옵티마이저가 중심을 이룹니다. Q. 스토리지 엔진의 주요 특징은 무엇인가?더보기실제 데이터를 디스크 스토리지에 저장 및 읽기 부분을 전담MySQL 서버에서 MySQL 엔진은 하나지만 스토리지 엔진은 여러 개 동시 사용 가능테이블에 스토리지 엔진을 지정할 수 있음각 스토리지 엔진은 성능 향상을 위한 기.. 2025. 4. 25.