분류 전체보기 (12) 썸네일형 리스트형 MySQL Index (3) EXPLAIN EXPLAIN 을 이용해서 MySQL이 쿼리를 어떻게 실행하는 지에 대한 정보를 출력할 수 있습니다. EXPLAIN으로 실행한 결과입니다. 아래 MySQL의 문서에 출력 내용에 대해서 설명이 되어있습니다. https://dev.mysql.com/doc/refman/8.0/en/explain-output.html MySQL :: MySQL 8.0 Reference Manual :: 8.8.2 EXPLAIN Output Format 8.8.2 EXPLAIN Output Format The EXPLAIN statement provides information about how MySQL executes statements. EXPLAIN works with SELECT, DELETE, INSERT, REPLA.. MySQL index - 인덱스 컬럼의 사이즈에 따른 조회 속도 성능 체크 삽질기 인덱스 컬럼 사이즈와 SELECT 속도에 대해서 테스트를 진행해보았습니다. 인덱스 컬럼 사이즈가 큰 경우에는 Page에 저장되는 인덱스정보개수가 적어지기 때문에, 페이지테이블에 대한 접근이 증가하기 때문에, 성능상 좋지 않다고 말씀드렸었습니다. 실제로 인덱스로 사용하는 컬럼의 사이즈가 큰 경우에 SELECT 조회에 어떤 영향을 주는지 확인해보겠습니다. 테스트를 진행하는 테이블의 스키마입니다. mysql> desc employees; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+.. MySQL Index (2) 기본 기능 인덱스는 단순히 Select 조회 뿐만아니라 Update/Insert/Delete와 같은 다양한 쿼리에 모두 영향을 줍니다. 따라서 인덱스 생성은 매우 중요한 작업이라고 할 수 있습니다. 인덱스를 생성시의 가장 중요한 원칙은 cardinality가 높은 컬럼을 인덱스로 지정해야 한다는 것입니다. cardinality 를 간단히 정의하면, 원소의 개수를 의미합니다. 데이터를 더 빠르게 찾기위해서 색인(index)를 만든다고하면, 최대한 중복되는 개수가 적은 성질의 데이터를 이용해서 인덱스를 만드는 것이 인덱스에서는 중요합니다. 만약에 인덱스로 찾아낸 데이터를 다시 걸러내야 한다면, 디스크 접근에 걸린 시간만큼 많은 시간이 소요될 것입니다. 그리고 복합 인덱스의 경우에는 불필요한 row에 접근을 줄이기 위해.. MySQL Index (4) 커버링 인덱스 커버링 인덱스는 쿼리를 실행하는 필요한 모든 데이터를 가지는 인덱스를 의미합니다. B+TREE 구조에서 리프(leaf)노드에 실제 데이터가 저장된다고 했었습니다. 하지만, 만약에 쿼리 필요한 모든 데이터가 인덱스에 포함되있다면, 리프(leaf)노드까지 찾아가지 않아도 되기 때문에, 매우 빠르게 검색이 가능해집니다. index로 설정한 컬럼으로만 SELECT / WHERE / ORDER BY / GROUP BY를 작성하면, 커버링 인덱스를 이용할 수 있게 됩니다. 이전 포스트에서 작성한 테스트 테이블을 가지고 테스트를 계속 진행하겠습니다. 테스트를 위해서 간단한 인덱스를 만들겠습니다. CREATE INDEX IDX_COVERING_TEST ON employees (email); 아래 쿼리를 실행해보겠습니다.. MySQL Index (1) 개요 MySQL은 인덱스를 메모리 상에서 B+TREE 구조로 관리합니다. B-TREE구조는 들어봤어도, B+TREE는 생소할 수 있다고 생각합니다. 간략하게 그림으로 둘 사이의 비교를 해보겠습니다. 아래는 B-TREE의 구조입니다. 아래는 B+TREE의 구조인데, B-TREE구조와 다르게, 실제 데이터(d1 ~ d7)이 leaf노드에만 달려있습니다. 그리고, leaf 노드간에 링크로 연결되어있는 구조임을 알 수 있습니다. B+TREE 구조의 가장 큰 특징은 트리구조에서 리프(leaf)노드에만 실제 데이터가 저장된다는 부분입니다. 반면에 B-TREE는 모든 노드에 데이터가 저장되기 때문에, 리프(leaf)노드까지 찾아가야 하는 B+TREE 구조보다 검색시에 더 좋은 성능을 가지게 됩니다. 반대로 B+TREE는 .. MySQL Lock (5) Gap Locks gap lock은 index record 사이에 lock을 겁니다. 위의 그림처럼 index record에 거는 lock아니라 index record간의 gap에 lock을 걸 기 때문에, 새로운 record가 gap에 추가 되는 것을 방지할 수 있습니다. 실제로 테스트를 진행하면서 동작을 확인해보겠습니다. 먼저, 테스트를 위한 테이블을 생성합니다. CREATE TABLE users ( id INTEGER AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); INSERT INTO users (username, created_at) VALUES ('Kenton_Kirlin'.. MySQL lock (4) Record Lock record lock은 index record에 대한 lock입니다. 실제로 테스트 데이터로 테스트를 진행해보겠습니다. 먼저, 테스트를 위한 테이블을 생성합니다. CREATE TABLE users ( id INTEGER AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() )Engine=InnoDB CHARSET=utf8; INSERT INTO users (username, created_at) VALUES ('Kenton_Kirlin', '2017-02-16 18:22:10.846'), ('Andre_Purdy85', '2017-04-02 17:11:21.417'), ('Ha.. MySQL lock (3) intention lock 이번 포스트에서는 row lock에대해서 더 상세히 살펴보겠습니다. 트랜잭션이 row lock을 획득하게 되면, 동시에 intention lock이라고 하는 것도 획득하게 됩니다. 그런데, 이 intention lock이라고 하는 것은 왜 사용하는 것일까요? intention lock은 테이블 레벨의 lock이고, 트랜잭션에서 테이블의 row 를 조작하기 위해서 S와 X lock중에서 어떤 lock을 사용하고 있는 지를 알려줍니다. itention lock에는 2가지 종류가 있습니다. intention share lock (IS) intention lock이 IS인경우에는 테이블의 row에 접근하는 트랜잭션이 S lock 이라는 의미입니다. intention exclusive lock (IX) inten.. 이전 1 2 다음