1. explain 결과 필드#

  1. table : 대상 테이블
  2. id : 처리순서
  3. select_type : 처리될 select 타입
  4. type : 수행될 join 타입
  5. key : 옵티마이저가 사용할 인덱스
  6. key_length : 사용할 인덱스 길이
  7. ref : 선택된 인덱스를 통해 가져올 칼럼
  8. rows : 검색할 row 수
  9. extra : 옵티마이저의 부가정보

1.1. explain의 type#

  1. const : 테이블에 매칭되는 row가 한개만 있는 경우, pk나 unique 인덱스를 사용
  2. eq_req : 이전 테이블에서 찾은 값중 하나의 값만이 해당 테이블에 존재하는 경우, pk나 unique 인덱스를 사용
  3. ref : 이전 테이블에서 찾은 값중 몇개의 값이 해당 테이블에 존재하는 경우, pk나 unique 인덱스를 사용하지 않음, 인덱스에 매칭되는 값이 적으면 좋으나 많으면 속도가 느릴수 있음
  4. index_merge : 5.0 이후 동일한 테이블내 여러개의 인덱스를 혼합해서 사용하도록 변경됨, 속도에 대해서는 경우마다 다를듯
  5. unique_subquery : 서브쿼리에서 인덱스를 이용해 정확한 row를 찾은 경우, index_subquery와 비슷하나 pk나 unique 인덱스를 사용
  6. index_subquery : 서브쿼리에서 인덱스를 이용하는 경우, 단 pk나 unique 인덱스를 사용하지 않음
  7. range : 주어진 범위내 값을 가져오는 경우, 인덱스를 사용할수도 있음, 검색의 범위와 카디널러티에 따라 속도에 영향을 받음
  8. index : 모든 인덱스를 스캔하는 경우, 즉 index에 대한 full scan
  9. all : full table scan

1.2. explain의 extra#

1.2.1. 좋은거#

  1. Using index : 테이블은 거치지 않고 인덱스에서 바로 값을 가져간다.
  2. Using where : 특정 데이터를 한정하는 것으로 full scan을 막는다.
  3. Distinct : 이전 테이블과 조합되는 경우의 수가 하나씩 밖에 없음
  4. Not exists : left join최적화를 사용할 수 있으며, 많은 row는 남겨놓을수 있음

1.2.2. 나쁜거#

  1. Using filesort : 추가적인 정렬작업을 진행
  2. Using temporary : 임시 테이블을 만들어서 사용, 대부분 order by와 group by에 해당되는 칼럼이 다른 경우 발생
  3. Range checked for each record : range 쿼리가 선택도가 굉장히 낮은 인덱스와 조합되는 경우

1.3. 성능을 확인하기 위해서는#

explain에서 조인 테이블 순서와 방법(explain의 type), 테이터양(rows)을 봐야 한다.

2. MySQL 인덱스#

2.1. 명령어#

2.1.1. show index from 테이블명#

2.1.2. select * from 테이블명 procedure analyze(칼럼숫자)#

3. MySQL 조인#

MySQL은 내부적으로 nested loop join만을 사용한다.

4. MySQL 모니터링#

4.1. show status#

4.1.1. Com_xxx 속성들#

  1. Com_insert
  2. Com_update
  3. Com_delete
  4. Com_select

4.1.2. Handler 속성들#

  1. Handler_read_first
  2. Handler_read_key
  3. Handler_read_next
  4. Handler_read_prev
  5. Handler_read_rnd
  6. Handler_read_rnd_next

4.1.3. 인덱스를 통한 row access일 경우 handler 속성들#

  1. Handler_read_first
  2. Handler_read_key
  3. Handler_read_next
  4. Handler_read_prev

4.1.4. 테이블 스캔을 통한 row access일 경우 handler 속성들#

  1. Handler_read_rnd
  2. Handler_read_rnd_next

4.2. show xxx_statistics (구글 패치)#

4.2.1. show index_statistics like '%인덱스명%'#

5. UNION 및 기타 SQL#

5.1. UNION#

  1. in, or 보다는 union 으로 해주면 mysql 이 더 최적화를 잘한다.
-- 근데 union으로 하면 쿼리가 너무 길어서 가독성이 떨어진다는.. T.T

5.2. 쿼리캐시 제어#

  1. SQL_CACHE, SQL_NO_CACHE 힌트를 사용

5.3. count(*) 쿼리#

5.4. 높은 limit 사용#

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-16) was last changed on 10-Jun-2015 09:34 by DongGukLee