본문 바로가기
개발/성능개선

인덱스 활용

by BellOne4222 2024. 3. 8.

인덱싱 장점

  • 검색 성능 향상
    • WHERE 절에서 특정 칼럼을 이용한 조건 검색이 빨라집니다. 인덱스가 없으면 데이터베이스 엔진은 테이블 전체를 스캔하여 조건에 맞는 행을 찾아야 합니다. 하지만 인덱스가 있다면 인덱스를 사용하여 더 빠르게 검색이 가능합니다.
  • 조인 성능 향상
    • JOIN절에서 조인할 때 인덱스가 있는 경우, 데이터베이스 엔진은 인덱스를 이용하여 조인을 수행할 수 있습니다. 이는 두 테이블 간의 매칭되는 행을 효율적으로 찾을 수 있도록 도와줍니다.
  • 정렬 및 그룹화 성능 향상
    • 인덱스는 정렬 및 그룹화 작업에도 도움을 줍니다. 특히, ORDER BY 나 GROUP BY 절에서 인덱스를 사용하면 정렬이나 그룹화 작업이 빨라집니다.
  • 범위 검색 최적화
    • 일부 인덱스는 범위 검색에 특히 유용합니다. 예를 들어, 날짜 범위나 숫자 범위에 대한 검색에서 인덱스를 사용하면 효율적으로 원하는 결과를 얻을 수 있습니다.

 

인덱스 생성

-- 인덱스 생성
CREATE INDEX idx_notice_createDate ON notice ( createDate );

-- 인덱스 확인
show index from notice;

 

where 절 join절에 컬럼이 여러가지 일때

  • 칼럼에 카디널리티 수를 기준으로 설정하기.(특정 칼럼이나 관계에서 고유한 값을 가지는 정도)
    • 사람 테이블에 성별 , 이메일/주민번호는 다른 칼럼에 비해 카디널리티 수치가 높다.
SELECT
  CONCAT(ROUND(COUNT(DISTINCT id) / COUNT(*) * 100, 2), '%') AS id_cardinality,
  CONCAT(ROUND(COUNT(DISTINCT title) / COUNT(*) * 100, 2), '%') AS title_cardinality,
  CONCAT(ROUND(COUNT(DISTINCT content) / COUNT(*) * 100, 2), '%') AS content_cardinality,
  CONCAT(ROUND(COUNT(DISTINCT who) / COUNT(*) * 100, 2), '%') AS who_cardinality,
  CONCAT(ROUND(COUNT(DISTINCT createDate) / COUNT(*) * 100, 2), '%') AS createDate_cardinality,
  CONCAT(ROUND(COUNT(DISTINCT updateDate) / COUNT(*) * 100, 2), '%') AS updateDate_cardinality
FROM notice;

 

인덱스 확인

explain
SELECT * FROM notice
WHERE createDate BETWEEN '2023-01-15 00:00:00' AND '2023-01-15 23:59:59'
;

  • id
    • 각 쿼리 블록 또는 서브쿼리에 대해 부여된 고유한 식별자. 여러 서브쿼리가 있는 경우 계층적으로 표현됩니다.
  • select_type
    • 쿼리의 유형을 나타냅니다. "SIMPLE"은 단순한 SELECT 쿼리를 나타냅니다.
  • table
    • 쿼리가 참조하는 테이블의 이름.
  • type
    • 테이블에서 레코드를 읽는 방법을 나타냅니다. 여기서 "range"는 인덱스를 사용하는 범위 스캔을 의미합니다
  • possible_keys
    • 쿼리에서 사용될 수 있는 인덱스 목록. 여기서는 idx_notice_createDate 인덱스를 사용할 수 있음을 나타냅니다.
  • key
    • 실제로 선택된 인덱스. 여기서는 idx_notice_createDate 인덱스가 선택되었습니다.
  • Extra
    • 기타 정보. 여기서 Using index condition 은 인덱스 조건을 사용하여 필터링 되었음을 나타냅니다.

 

  • 결과
    • notice 테이블에 대한 단순한 SELECT 쿼리가 있으며, idx_notice_createDate   인덱스가 사용되어 범위 스캔을 수행하고 있다는 것을 나타냅니다
    • Using index condition 은 인덱스의 조건을 사용하여 레코드를 필터링 했음을 나타냅니다.

'개발 > 성능개선' 카테고리의 다른 글

비동기 방식  (0) 2024.03.10
인덱스를 타지 않는 경우  (0) 2024.03.09
Mysql Profiling으로 수치 확인  (0) 2024.03.09
Ehcache  (0) 2024.03.08
nGrinder 용어  (0) 2024.03.05