티스토리 뷰
SQL 작성 시 인덱스를 사용할 수 있도록 쿼리 작성에 대해 설명한다.
인덱스를 사용하기 위한 기본 규칙
1. WHERE 절이나 ORDER BY 또는 GROUP BY 가 인덱스를 사용하려면 기본적으로 인덱스된 컬럼의 값 자체를 변환하지 않고 그대로 사용한다는 조건을 만족해야한다.
ex)
ex) 인덱스를 사용하지 못한 예
SELECT * FROM salaries WHERE salary * 10 > 150000;
--->
SELECT * FROM salaries WHERE salary > 150000 / 10 ;
인덱스의 컬럼을 변형해서 비교하는 경우에는 인덱스를 이용할 수 없게 된다.
2. WHERE 절에 사용되는 비교 조건에서 연산자 양쪽의 두 비교 대상 값은 데이터 타입이 일치해야한다.
CREATE TABLE tb_test ( age VARCHAR(10), INDEX ix_age(age));
INSERT INTO tb_test VALUES ('1'),('2'),('3');
SELECT * FROM tb_test WHERE age=2;
비교되는 두 값의 타입이 다르기 때문에 인덱스 레인지 스캔을 사용하지 못하고, 인덱스 풀 스캔 사용하게 된다.
WHERE 절의 인덱스를 사용
CREATE TABLE employees ( first_name VARCHAR(10), last_name VARCHAR(10));
ALTER TABLE employees ADD INDEX idx_name ( first_name );
--- AND 조건
SELECT * FROM employees WHERE first_name ='kebin' AND last_name = 'poly';
first_name 컬럼 인덱스가 있고 AND 연산자로 연결됐다면 first_name의 인덱스를 이용한다.
SELECT * FROM employees WHERE first_name ='kebin' OR last_name = 'poly';
(풀 테이블 스캔) + (인덱스 레인지 스캔 ) 의 작업량보다는 (풀 테이블 스캔) 한번이 더 빠르기 때문에
옵티마이저는 풀 테이블 스캔 선택
-> (first_name, last_name ) 인덱스가 있다면
ALTER TABLE employees ADD INDEX idx_first_last ( first_name, last_name);
SELECT * FROM employees WHERE first_name ='kebin' OR last_name = 'poly';
WHERE 절에서 각 조건이 AND로 연결되면 읽어와야 할 레코드의 건수를 줄이는 역할을 하지만 각 조건이 OR 로 연결되면 읽어서 비교해야 할 레코드가 더 늘어가기 때문에 WHERE 조건에 OR 연산자가 있다면 주의해야한다.
Reference
'Data Enginnering > Mysql' 카테고리의 다른 글
MySQL 데이터 타입(1) (0) | 2021.01.10 |
---|---|
MySQL 인덱스 사용규칙 (2) (1) | 2021.01.03 |
MySQL - login-path (0) | 2020.12.27 |
MySQL - mysqldump (0) | 2020.12.26 |
MySQL - DB Monitoring ( pmm ) 구축 (1) | 2020.12.21 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- python
- flask
- ios
- network
- 로그
- spark
- MYSQL
- 도커
- ElasticSearch
- docker
- SWIFT
- 네트워크
- 리눅스
- nginx
- logstash
- WEB
- BigData
- pytest
- 엘라스틱서치
- linux
- SQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함