본문 바로가기
Code/Sql

mysql 인덱스 확인, mysql 실행계획, 테이블 데이터 용량 확인

by 띵커베르 2023. 1. 16.
728x90

쿼리가 너무 느린부분이 있어 실행계획을 살펴보다 또 볼 날이 있을 듯 하여 올림.

 

===

명령어.

 

인덱스 확인:

SHOW INDEX FROM <테이블명>;

ex:SHOW INDEX FROM stop_orders;

 

인덱스 추가:

//인덱스 정렬은 8.0부터 가능하다.

 

CREATE INDEX <인덱스명> ON <테이블명> ( 칼럼명1, 칼럼명2, ... );

또는

ALTER TABLE <테이블명> ADD INDEX <인덱스이름> (칼럼명1, 칼럼명2, ...);

ex: ALTER TABLE stop_orders ADD INDEX index_stop_orders_on_order_id (order_id desc);

 

인덱스 삭제:

ALTER TABLE <테이블명> DROP INDEX <인덱스이름>;

ALTER TABLE stop_orders DROP INDEX index_stop_orders_on_order_id;

 

=========

테이블 용량 확인 MB로 보여짐

SELECT table_name AS `Table`,
       round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES
WHERE table_schema = DATABASE()
  AND table_name = 'orders';

=========

실행계획

explain select query...

  • 항목
    • id : 쿼리 내의 select 문의 실행 순서
    • select_type: select 유형
      • SIMPLE: 단일 테이블에서 데이터를 검색하는 경우
      • PRIMARY: 복잡한 쿼리에서 가장 바깥 쿼리를 처리하는 경우
      • SUBQUERY: 부가적인 서브쿼리를 처리하는 경우
      • DERIVED: FROM 절에서 파생된 테이블을 처리하는 경우
      • UNION: UNION이나 UNION ALL로 여러 개의 SELECT 문을 처리하는 경우
      • DEPENDENT UNION: UNION 처리에서 이전 SELECT의 결과에 의존해 처리해야 하는 경우
      • UNION RESULT: UNION 결과를 처리하는 경우
      • DEPENDENT SUBQUERY: 서브쿼리 처리 중 외부 쿼리 결과에 의존해야 하는 경우
      • DEPENDENT UNION RESULT: UNION 결과를 처리하는 과정에서 이전 SELECT 결과에 의존해야 하는 경우
      • => 보통 SIMPLE이 가장 빠르고, SUBQUERY, DERIVED, UNION, DEPENDENT SUBQUERY, DEPENDENT UNION, UNION RESULT, DEPENDENT UNION RESULT 순으로 처리 속도가 느려집니다. 
        하지만 쿼리의 구성에 따라 다를 수 있으므로, 개별적으로 확인하는 것이 좋습니다.
    • 테이블: 참조하고 있는 테이블
    • type: 조인 타입 아래로 갈수록 안좋은 형태
      • 1. system : 테이블에 단 하나의 행만 존재(=시스템 테이블). const 조인의 특별한 형태이다.
      • 2. const : 하나의 매치되는 행만 존재하는 경우. 하나의 행이기 때문에 상수로 간주되며, 한번만 읽어들이기 때문에 무척 빠르다.
      • 3. eq_ref : 조인수행을 위해 각 테이블에서 하나의 행만이 읽혀지는 형태. const 타입 외에 가장 훌륭한 조인타입이다.
      • 4. ref : ref조인에서 키의 가장 왼쪽 접두사 만 사용하거나 키가 a PRIMARY KEY또는 UNIQUE인덱스 가 아닌 경우 (즉, 조인이 키 값을 기반으로 단일 행을 선택할 수없는 경우) 사용된다. 사용되는 키가 몇 개의 행과 만 일치하는 경우 이는 좋은 조인 유형이다.
      • 5. fulltext : fulltext 색인을 사용하여 수행된다.
      • 6. ref_or_null : 이 조인 유형은 비슷 ref하지만 MySQL이 NULL값 을 포함하는 행을 추가로 검색한다는 점이 다르다. 이 조인 유형 최적화는 하위 쿼리를 해결하는 데 가장 자주 사용된다.
      • 7. index_merge : 인덱스 병합 최적화가 적용되는 조인타입. 이 경우, key컬럼은 사용된 인덱스의 리스트를 나타내며 key_len 컬럼은 사용된 인덱스중 가장 긴 key명을 나타낸다.
      • 8. range : 인덱스를 사용하여 주어진 범위 내의 행들만 추출된다. key 컬럼은 사용된 인덱스를 나타내고 key_len은 사용된 가장 긴 key부분을 나타낸다. ref 컬럼은 이 타입의 조인에서 NULL 이다. range 타입은 키 컬럼이 상수와 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN 또는 IN 연산에 사용될때 적용된다.
      • 9. index : 이 타입은 인덱스가 스캔되는걸 제외하면 ALL과 같다. 보통 인덱스 파일이 데이터 파일보다 작기 때문에 ALL보다 빠르다.
      • 10. ALL : 이전 테이블과의 조인을 위해 풀스캔이 된다. 만약 조인에 쓰인 첫 테이블이 고정이 아니라면 비효율적이다. 그리고 대부분의 경우 아주 느리며, 보통 상수값이나 상수인 컬럼값으로 row를 추출하도록 인덱스를 추가하여 ALL 타입을 피할 수 있다.
    • possible_keys: 사용할 수 있는 인덱스를 나타냄
    • key: mysql이 사용한 key 또는 인덱스를 나타냄
    • key_len: 사용한 인덱스의 길이 key 컬럼이 null 이면 null 임
    • ref: 행을 추출할떄 사용 된 컬럼이나 상수값
    • rows: 찾아야할 row 의 수(추정치- 정확하지않음)
    • extra: 해석에 대한 추가 정보. 
      • Using filesort: 정렬을 위해 파일 정렬 알고리즘을 사용하고 있음
      • Using temporary: 쿼리 처리를 위해 임시 테이블을 사용하고 있음
      • Using index: 인덱스를 사용하고 있음
      • Using index condition: 인덱스 필터링을 사용하고 있음
      • Using where: WHERE 절에 대한 추가적인 조건을 확인하고 있음
      • Using join buffer: 조인 처리를 위해 버퍼를 사용하고 있음
      • Using sort_union(): UNION 처리를 위해 정렬을 사용하고 있음
      • Using intersect(): INTERSECT 처리를 위해 사용하고 있음
      • Using union(): UNION 처리를 위해 사용하고 있음
      • Using index for group-by: GROUP BY 절에서 인덱스를 사용하고 있음
      • Using filesort for group-by: GROUP BY 절에서 파일 정렬 알고리즘을 사용하고 있음
      • Using index for order-by: ORDER BY 절에서 인덱스를 사용하고 있음
      • Using filesort for order-by: ORDER BY 절에서 파일 정렬 알고리즘을 사용하고 있음
      • Range checked for each record: 인덱스를 사용하여 범위 검색을 수행하고 있음
      • Using index for group-by: GROUP BY 절에서 인덱스를 사용하고 있음
      • Using index for distinct: DISTINCT 처리를 위해 인덱스를 사용하고 있음
      • Using index for group-by/distinct: GROUP BY 또는 DISTINCT 처리를 위해 인덱스를 사용하고 있음
      • Using where with pushed condition: WHERE 절에서 조건을 확인하고 있는데, 인덱스 필터링으로 인해 조건 검사를 더 효율적으로 처리할 수 있음
      • Using join buffer (Block Nested Loop, Batched Key Access): 조인 처리를 위해 버퍼를 사용하고 있음

아래는 show index from table 했을시 나오는 정보

https://jeong0427.tistory.com/105

    1. root: 전체 쿼리의 실행 계획을 나타내는 루트 노드
    2. select_type: SELECT 쿼리의 유형
    3. type: 테이블의 접근 방법
    4. possible_keys: 선택 가능한 인덱스
    5. key: 실제 선택된 인덱스
    6. key_len: 선택된 인덱스의 길이
    7. ref: 인덱스의 비교 대상
    8. rows: 인덱스를 탐색할 때 탐색해야 할 행 수
    9. filtered: 조건절에 맞게 필터링된 행 수의 비율
    10. Extra: 추가 정보 (옵티마이저가 실행 계획을 만드는 과정에서 고려한 다른 요인들)

 

728x90

댓글