gbmin's Tech Notes

서버 구축 및 유지보수, 클라우드 컴퓨팅, 네트워크 보안, IT 분야 기술 노트. :)

Tech Notes/Mysql & MariaDB

mysql, mariadb index 생성 및 쿼리 최적화

gbmin 2023. 5. 2. 22:21

index(인덱스)는 데이터베이스 테이블의 일부 또는 전체 열의 값을 사용하여 생성된 키를 말하며
데이터 검색, 조회 및 정렬하는 데 사용되는 자료 구조다.
index를 사용하면 데이터베이스에서 데이터를 빠르게 검색할 수 있다.
MySQL과 MariaDB 모두 인덱스를 사용할 수 있으며, 다양한 인덱스 유형이 있다.

- 목차

1. index 생성, 삭제

1) index 생성

2) index 삭제 방법

2. index 종류

1) B-Tree index (B-트리 인덱스)

2) Hash index (해시 인덱스)

3) FullText search index (전문 검색 인덱스)

4) Spatial index (공간 인덱스)

3. index 설정 확인 및 쿼리 실행 계획

1) 테이블 index 정보 확인 방법

2) 쿼리 실행 계획

1. index 생성, 삭제

1) index 생성

MySQL과 MariaDB에서 index를 생성하는 방법은 크게 두 가지다.

CREATE INDEX 문 사용

CREATE INDEX 인덱스명 ON 테이블명(컬럼명);

ALTER TABLE 문을 사용하는 방법

ALTER TABLE 테이블명 ADD INDEX 인덱스명 (컬럼명);

위와 같이 ALTER TABLE 문을 사용하여 index를 생성할 수 있습니다. ADD INDEX 절은 index를 추가하는 것을 의미하며, index명과 칼럼명은 CREATE INDEX 문과 동일하게 사용된다.

2) index 삭제 방법

DROP INDEX 인덱스명 ON 테이블명;

2. index 종류

1) B-Tree index (B-트리 인덱스)

B-Tree index는 가장 일반적으로 사용되는 유형이다. 일반적으로 키 칼럼의 값과 해당 키 값을 가진 데이터의 위치를 저장한다.

이러한 index는 특정 키 값을 검색하는 데 효율적이며, ORDER BY 절과 같은 정렬 작업에서도 유용하다.

  • 설정 방법
CREATE INDEX 인덱스명 ON 테이블명(컬럼명);
  • 쿼리 예시
SELECT * FROM 테이블명 WHERE 컬럼명 = '조건';



2) Hash index (해시 인덱스)

Hash index는 빠른 검색이 필요한 대용량 데이터베이스에서 사용된다. 이 index는 해시 함수를 사용하여 데이터를 빠르게 검색하지만
Hash index는 B-Tree 인덱스보다 훨씬 적은 작업에서만 빠르며, 일부 제약 사항이 있다.

예를 들어 Hash index는 부분 일치 검색을 지원하지 않으며, 정렬 작업에서 사용할 수 없다.

  • 설정 방법
CREATE INDEX 인덱스명 ON 테이블명(컬럼명) USING HASH;
  • 쿼리 예시
SELECT * FROM 테이블명 WHERE 컬럼명 = '조건';


3) FullText search index (전문 검색 인덱스)

FullText search index는 텍스트 검색을 위해 사용된다. 이 인덱스는 전문 검색 엔진을 사용하여 텍스트를 색인화하고 검색한다.

  • 설정 방법
CREATE FULLTEXT INDEX 인덱스명 ON 테이블명(컬럼명);
  • 쿼리 예시
SELECT * FROM 테이블명 WHERE MATCH(컬럼명) AGAINST('검색어');


4) Spatial index (공간 인덱스)

Spatial index는 지리 정보를 저장하는 데 사용된다. 이 인덱스는 공간 데이터를 지리 정보에 맞게 색인화하고 검색한다.

  • 설정 방법
CREATE SPATIAL INDEX 인덱스명 ON 테이블명(컬럼명);
  • 쿼리 예시
SELECT * FROM 테이블명 WHERE ST_CONTAINS(컬럼명, POINT(경도, 위도));

3. index 설정 확인 및 쿼리 실행 계획

1) 테이블 index 정보 확인 방법

SHOW INDEX FROM 테이블명;


2) 쿼리 실행 계획

MySQL에서 EXPLAIN은 SELECT 문을 실행할 때 쿼리 실행 계획을 확인할 수 있는 명령어다.
EXPLAIN을 사용하면 쿼리가 실행되는 방식을 이해하고 쿼리의 성능을 향상하는 데 도움이 된다.

  • 쿼리 예시
EXPLAIN SELECT *
FROM orders
WHERE order_date BETWEEN '2022-01-01' AND '2022-01-31'
AND status = 'completed';

위의 쿼리에서, BETWEEN 연산자와 AND 연산자를 사용하여 order_date와 status 열을 조건으로 지정한다.
이 쿼리를 실행할 때 EXPLAIN을 사용하여 실행 계획을 확인할 수 있다.

  • 실행 결과
-----------------------------------------------------------------------------------------------------------------------------------
| id | select_type | table  | partitions  | type  | possible_keys | key    | key_len   | ref   | rows  | filtered  | Extra        |
-----------------------------------------------------------------------------------------------------------------------------------
| 1  | SIMPLE      | orders | NULL        | ref   | status        | status | 102       | const | 1000  | 10.00     | Using where  |
-----------------------------------------------------------------------------------------------------------------------------------

  • 각 컬럼의 의미

id: SELECT 문에서 쿼리의 각 부분마다 할당된 번호
select_type: 쿼리의 유형입니다. SIMPLE은 단순한 SELECT 문이며, 다른 값을 가질 수도 있다.
table: 쿼리에서 사용된 테이블의 이름
partitions: 사용되는 파티션의 목록. NULL 값이면 파티션을 사용하지 않음.
type: 사용된 JOIN 유형입니다. 쿼리가 단일 테이블을 사용하면 index로 표시.
possible_keys: 쿼리에 사용될 수 있는 인덱스의 목록.
key: 쿼리에서 실제로 사용된 인덱스의 이름.
key_len: 인덱스에서 사용된 바이트 수.
ref: 인덱스에서 사용된 열의 목록.
rows: 쿼리에 의해 반환된 행의 수.
filtered: 필터링된 데이터의 비율.
Extra: 추가 정보다. Using where은 WHERE 조건을 처리하기 위해 인덱스를 사용했다는 것을 의미한다.


실행 계획을 이해하면, 쿼리에서 발생하는 병목 현상이나 성능 저하 원인을 파악하고 최적화할 수 있다.