728x90

Index 를 타지 않은 경우

 

  1. WHERE 적용 및 JOIN 실행
  2. GROUP BY
  3. DISTINCT
  4. HAVING 조건 적용
  5. ORDER BY
  6. 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 를 타는지 확인 해보기

  1. WHERE 절이 INDEX 를 사용 할 수 있는가?
  2. GROUP BY 절이 INDEX 를 사용 할 수 있는가?
  3. 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