RealMySql - Select (Index)
728x90
Index 를 타지 않은 경우
- WHERE 적용 및 JOIN 실행
- GROUP BY
- DISTINCT
- HAVING 조건 적용
- ORDER BY
- LIMIT
Index 를 타는 경우
ORDER BY 나 GROUP BY 절 이 있더라도 Index 를 이용해 처리할 때는 그 단계 자체가 불필요 하므로 생략된다.
Index 사용 기본 규칙
WHERE, ORDER BY, GROUP BY 가 INDEX 를 사용하려면 기본적으로 인덱스된 컬럼의 값 자체를 변환하지 않고 사용해야함
원본값을 검색하거나 정렬 할때만 B-Tree 에 정렬된 INDEX 를 이용한다.
Index 를 타지 않는 SQL 구문
SELECT * FROM salaries WHERE salary * 10 > 150000;
Index 를 탈 것 같지만 타지 않는 SQL 구문
select * from salaries where salary > 150000 / 10;
Index 를 타는 올바른 구문
select * from salaries where salary > 150000;
컬럼 타입이 다르게 비교되는 경우에도 Index 가 걸려 있음에도 불구하고 Full Scan 의 대상이 된다.
WHERE 절의 조건 순서
WHERE 절 에서는 조건이 명시된 순서는 중요 하지 않다. 인덱스를 구성하는 컬럼에 대한 조건이 있는지가 더 중요하다.
WHERE 절 에서 조심해야 할 것들
- OR 연산을 사용할때 주의 해야한다.
GROUP BY 절 사용시 조심해야 할 것들
- GROUP BY 는 WHERE 절 과 다르게 모든 column 이 INDEX 를 가지고 있어야 INDEX 를 탈 수 있다.
ORDER BY 절 사용시 조심해야 할 것들
- ORDER BY 는 GROUP BY 와 동일 한대 한가지 조건이 더 존재한다.
- 모든 조건이 ASC 이거나 DESC 여야 한다는 조건이다.
My sql 의 INDEX 는 모든 column 이 오름차순으로만 정렬 되어 있기 때문에 ORDER BY 절에서는 모든 column 이 ASC 이거나 DESC 일때만 INDEX 를 타게된다.
Query 튜닝 노하우
- WHERE 절 ORDER BY 절 이 동시에 같은 INDEX 를 사용
- 나머지 방식 보다 제일 빠름 가능하면 이방식으로 튜닝 할 것을 권장
- WHERE 절 만 INDEX 사용 ORDER BY 는 미사용
- 별도의 sorting 으로 정렬 할 경우
- WHERE 절의 조건에 일치하는 record의 건수가 많지 않을 때 효율적
- ORDER BY 절만 INDEX 를 사용
- 주로 아주 많은 record 를 조회 해야 할 경우 사용
Query 가 INDEX 를 타는지 확인 해보기
- WHERE 절이 INDEX 를 사용 할 수 있는가?
- GROUP BY 절이 INDEX 를 사용 할 수 있는가?
- GROUP BY 절과 ORDER BY 절이 동시에 INDEX를 사용 할수 있는가?
728x90
'SQL > MySql' 카테고리의 다른 글
Explain And Index (with. mysql) (1) | 2022.10.05 |
---|---|
Mysql 자료형 (0) | 2021.11.29 |
MySQL - tabel 생성하기 (0) | 2020.10.10 |
댓글
이 글 공유하기
다른 글
-
Explain And Index (with. mysql)
Explain And Index (with. mysql)
2022.10.05 -
Mysql 자료형
Mysql 자료형
2021.11.29 -
MySQL - tabel 생성하기
MySQL - tabel 생성하기
2020.10.10