일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- intellij
- template
- mybatis
- MySQL
- springboot
- 배열스트링
- 라즈베리파이
- github
- Gradle
- log4j2
- Java
- hikari
- between 날짜
- Spring Security
- ORACLE CLOUD
- between date
- bitbucket
- oracle
- datasource
- log4j profile
- STS
- Spring Boot
- ubuntu
- Spring
- hikaricp
- git
- python 개발환경
- oracle between
- Linux
- catalina log
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- intellij
- template
- mybatis
- MySQL
- springboot
- 배열스트링
- 라즈베리파이
- github
- Gradle
- log4j2
- Java
- hikari
- between 날짜
- Spring Security
- ORACLE CLOUD
- between date
- bitbucket
- oracle
- datasource
- log4j profile
- STS
- Spring Boot
- ubuntu
- Spring
- hikaricp
- git
- python 개발환경
- oracle between
- Linux
- catalina log
- Today
- Total
파워노트
Mysql Index 확인 본문
* 디비조회시 쿼리결과가 엄청 오래걸리는 경우 쿼리 플랜을 이용하여 쿼리 튜닝을 해야 한다.
1. 기존쿼리 분석.
* 주문정보 log 가 280만 row 디비 데이터 가 존재시 해당 데이터를 결과 조회시 4초가량 걸림.
select product_name, shop_name, sum(product_cnt)as productCnt, sum(product_price) as productPrice , shop_id
from tb_order_detail_stack
where timestamp BETWEEN timestamp(curdate()) AND timestamp(curdate()+1)
and pay_flag = 0
and daily_code not in (select daily_code from tb_order_detail_stack where pay_flag = 1 and timestamp BETWEEN timestamp(curdate()) AND timestamp(curdate()+1))
group by product_name, shop_name, shop_id
order by sum(product_price) DESC;
* DB Row가 많아 짐에 따라 쿼리 조회시 많은 시간이 소요될수 있기에 Index 를 설정하여 index scan이 동작할 수 있도록 한다.
2. index 설정.
* Index 고려
- Index 설정시 설정할 컬럼은 카디널리티(Cardinality)가 가장 높은 것을 잡아야 한다.
( 많은 그룹으로 나뉠수 있는 경우가 높은것.)
==> 남,여 데이터 처럼 두개로 나뉘는것은 의미가 없다. 주소정보나 시간값같은 분포도가 넓은 데이터가 유리하다.
( 현실에서의 아주 두꺼운 책에서 맨뒤의 인덱스 찾기 페이지에서 책속의 어느페이지에 내가 원하는 정보가 있는지 찾는것을 고려 하면 적당할 것이다. )
- 컬럼이 여러개 일경우 카디널리티가 높은순에서 낮은순으로 구성하는게 더 성능이 뛰어납니다.
==> no , 날짜, pay_flag 처럼 분포도가 넓은 순에서 낮은 순으로 ~~.
* index 지정할 컬럼을 선정한 이후에 설정한다.
생성 쿼리 ) create index 인덱스명 on 테이블명 (컬럼);
- create index tb_order_detail_stack_timestamp_index on tb_order_detail_stack (timestamp);
인덱스 설정 이후 쿼리 결과가 43ms 걸림.
3. index 추가 사항
- 동일한 데이터를 가진 colum을 indexing 하여 플랜을 실행해 보면 Full index scan 이라고 나오며 느린 결과를 보인다. ( 카디널리티가 높은 컬럼을 index 설정 해야함. )
- 컬럼 선정하여 indexing 을 했음에도 쿼리에 따라 index scan을 하지 않을수 있다.
예) DATE_ADD(NOW(), INTERVAL 1 MINUTE);
'mysql' 카테고리의 다른 글
mysql 외부접속 허용. (0) | 2020.07.12 |
---|---|
[Workbench] windows 10 , MySql Workbench 8.0 설치 하기 (1) | 2020.07.12 |