Book (6) 썸네일형 리스트형 [RealMySQL 8.0] 8. 인덱스 - 기타 인덱스 (멀티 밸류 인덱스, 클러스터링 인덱스, 유니크 인덱스, 외래키) 8.7 멀티 밸류 인덱스전문 검색 인덱스를 제외한 모든 인덱스는 레코드 1건이 1개의 인덱스 키 값을 가진다. 즉, 인덱스 키와 데이터 레코드는 1:1의 관계를 가진다. 하지만 멀티 밸류 인덱스는 하나의 데이터 레코드가 여러 개의 키 값을 가질 수 있는 형태의 인덱스다. 최근 RDBMS들이 JSON 데이터 타입을 지원하기 시작하면서 JSON의 배열 타입의 필드에 저장된 원소들에 대한 인덱스 요건이 발생한 것이다. 다음과 같이 신용 정보 점수를 JSON 타입 칼럼에 저장하는 테이블을 가정해보자.mysql> CREATE TABLE user ( user_id BIGINT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(10), last_name .. [RealMySQL 8.0] 8. 인덱스 - B-Tree 인덱스 8.3 B-Tree 인덱스B-Tree는 데이터베이스의 인덱싱 알고리즘 가운데 가장 일반적으로 사용되고, 가장 먼저 도입된 알고리즘이다. 하지만 아직도 가장 범용적인 목적으로 사용되는 인덱스 알고리즘이다. B-Tree에는 여러 가지 변형된 형태의 알고리즘이 있는데, DBMS에서는 주로 B+-Tree 또는 B*-Tree가 사용된다. Balanced를 의미하는 B-Tree는 칼럼의 원래 값을 변형시키지 않고 (물론 값의 앞부분만 잘라서 관리하기는 하지만) 인덱스 구조체 내에서는 항상 정렬된 상태로 유지한다. 전문 검색과 같은 특수한 요건이 아닌 경우, 대부분 인덱스는 거의 B-Tree를 사용할 정도로 일반적인 용도에 적합한 알고리즘이다. 8.3.1 구조 및 특성B-Tree는 트리 구조의 최상위에 하나의 "루.. [RealMySQL 8.0] 8. 인덱스 - 디스크 읽기 방식 / 인덱스란? 8. 인덱스인덱스는 데이터베이스 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분이다.각 인덱스의 특성과 차이는 상당히 중요하며, 물리 수준의 모델링을 할 때도 중요한 요소가 될 것이다. MySQL 서버의 옵티마이저가 발전하고 성능이 개선됐다고 해도 여전히 관리자의 역할은 매우 중요하다. 그래서 인덱스에 대한 기본 지식은 지금도 앞으로도 개발자나 관리자에게 매우 중요한 부분이며, 쿼리 튜닝의 기본이 될 것이다. 8.1 디스크 읽기 방식이번 장에서는 "랜덤(Random) I/O", "순차(Sequential) I/O"와 같은 디스크 읽기 방식을 먼저 간단히 알아보고 인덱스를 살펴보자. 컴퓨터의 CPU나 메모리처럼 전기적 특성을 띤 장치의 성능은 짧은 시간 동안 매우 빠른 속도로 발전했지만 디스크 같은 기계식 .. [RealMySQL 8.0] 5. 트랜잭션과 잠금 - MySQL의 격리 수준 5.4 MySQL의 격리 수준트랜잭션의 격리 수준(isolation level)이란 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다. 격리 수준은 크게 "READ UNCOMMITED", "READ COMMITED", "REPEATABLE READ", "SERIALIZABLE"의 4가지로 나뉜다. "DIRTY READ"라고도 하는 READ UNCOMMITED는 일반적인 데이터베이스에서는 거의 사용하지 않고, SERIALIZABLE 또한 동시성이 중요한 데이터베이스에서는 거의 사용되지 않는다. 4개의 격리 수준에서 순서대로 뒤로 갈수록 각 트랜잭션 간의 데이터 격리 정도가 높아지며, 동시 처리 성능도 떨어지는 것이 .. [RealMySQL 8.0] 5. 트랜잭션과 잠금 - InnoDB 스토리지 엔진 잠금 5.3 InnoDB 스토리지 엔진 잠금InnoDB 스토리지 엔진은 MySQL에서 제공하는 잠금과는 별개로 스토리지 엔진 내부에서 레코드 기반의 잠금 방식을 탑재하고 있다.InnoDB는 레코드 기반의 잠금 방식 때문에 MyISAM보다는 훨씬 뛰어난 동시성 처리를 제공하지만 이원화된 잠금 처리 탓에 MySQL 명령을 이용해 잠금에 대한 정보에 접근하기가 상당히 까다롭다. 하지만 최근 버전에서는 InnoDB의 트랜잭션과 잠금, 그리고 잠금 대기 중인 트랜잭션의 목록을 조회할 수 있는 방법이 도입됐다. 그리고 조금씩 업그레이드되면서 InnoDB의 중요도가 높아졌고, InnoDB의 잠금에 대한 모니터링도 더 강화되면서 Performace Schema를 이용해 InnoDB 스토리지 엔진의 내부 잠금(세마포어)에 대.. [RealMySQL 8.0] 5. 트랜잭션과 잠금 - 트랜잭션 / MySQL 엔진의 잠금 5. 트랜잭션과 잠금트랜잭션은 작업의 완전성을 보장해준다.즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해 이상현상이 발생하지 않게 만들어주는 기능이다. 잠금과 트랜잭션은 비슷한 개념 같지만 잠금은 동시성을 제어하기 위한, 트랜잭션은 데이터의 정합성을 보장하기 위한 기능이다.잠금은 여러 커넥션에서 동시에 동일한 자원을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할을 한다. 5.1 트랜잭션5.1.1 MySQL에서의 트랜잭션트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개의 쿼리가 있든 논리적인 작업 셋 자체가 100% 적용되거나 아무것도 적용되지 않아야 함을 보장해주는 것이다. 간단한 예제로 트랜잭션 관점에서 In.. 이전 1 다음