데이터베이스/MySQL 13

[MySQL] 프라이머리 키가 일반 인덱스보다 특별한 이유 - InnoDB 클러스터링 인덱스

프라이머리 키(PK)는 테이블에 하나밖에 없는 값이다. 오늘은 프라이머리 키가 왜 특별한지, 다른 키(인덱스)와의 차이는 무엇인지 알아보자. 참고로 이 글에서는 키(key)와 인덱스(index)를 같은 의미로 사용한다. InnoDB 클러스터링 인덱스 프라이머리 키의 중요성을 알기 위해서는 프라이머리 키가 클러스터링 인덱스라는 것부터 시작해야한다. 클러스터링 인덱스란 프라이머리 키 값이 비슷한 레코드끼리 묶어서 저장하는 것을 의미한다. 프라이머리 키 값에 의해 레코드의 물리적인 저장 위치가 결정되는 것이다. MySQL에서 클러스터링 인덱스는 InnoDB 스토리지 엔진에서만 지원한다. 프라이머리 키를 기준으로 데이터가 물리적으로 정렬되어 있기 때문에 프라이머리 키 기반의 검색이 매우 빠른 장점이 있다. 대신..

[MySQL] InnoDB 인덱스 잠금 테스트

InnoDB는 레코드 기반의 잠금 방식을 사용하는데, 중요한 점은 레코드 자체를 잠그는 것이 아니라 인덱스를 잠근다는 것이다. 이 부분은 잘못 설계하면 데이터베이스 성능에 큰 영향을 미칠 것 같아 확실히 알아보기 위해 테스트를 진행해보기로 했다. 먼저 전체적인 시나리오를 설명하면 (first_name, last_name, age) 속성을 가지는 member 테이블을 만들고 last_name 속성에 인덱스를 설정했다. 테이블에 저장된 ‘김민수’ 회원의 나이를 바꾸기 위해 UPDATE하는 트랜잭션을 시작하였다. 이 경우, 동시에 다른 ‘김’씨 성을 가진 회원 정보를 수정할 수 있을까? 얼핏 생각하면 ‘김민수’ 회원 한명의 레코드를 수정하고 있는 것 뿐인데, 김민수 회원이 아닌 다른 ‘김’씨 성을 가진 회원의..

[MySQL] 시스템 변수 내맘대로 설정해보기

Real MySQL 8.0을 읽으면서 MySQL과 데이터베이스에 대해 학습하는 스터디를 시작했다. 책을 읽다보니 특정 기능을 활성화/비활성화하거나 특정 설정 값들을 변경하기 위해 시스템 변수를 조작하라는 내용이 많이 나온다. 예를 들어 InnoDB 버퍼풀의 크기에 대해 innodb_buffer_pool_size 시스템 변수를 더 큰 값으로 설정하여 버퍼 풀의 크기를 확장할 수 있다거나, innodb_buffer_pool_instances 시스템 변수를 이용해 버퍼 풀 인스턴스의 개수를 조절할 수 있다는 내용이다. 책에서는 MySQL 서버가 실행되는 운영체제의 리소스에 따라 시스템 변수를 적절히 조정하여 MySQL 서버의 성능을 높이는 다양한 방법들을 설명하고 있다. 이런 방법들을 적용해보기 위해서는 현재..