다음과 같은 쿼리가 문제를 일으키고 있다고 해보자.

SELECT *
FROM product
WHERE category_id IN (11, 12, 13, 14) 
  AND price BETWEEN 10000 AND 50000
  AND product_status = 'ACTIVE'
ORDER BY created_at
LIMIT 20;

image.png

혼자 조회하는데도 1.3초나 걸린다. 다시 말하지만 운영환경으로 가면 여기에 10을 곱한 시간만큼 응답이 늘린다고 생각해야 한다.

쿼리가 느리다고 대충 인덱스를 추가해본다고 해보자. 그 전에 나중에 비교할 수 있도록 인덱스 추가 전 product 테이블의 인덱스 용량을 확인해보자.

-- [03]
-- 인덱스 추가 전 용량 확인
SELECT
    TABLE_NAME,
    ROUND(DATA_LENGTH / 1024 / 1024, 1) AS data_mb,
    ROUND(INDEX_LENGTH / 1024 / 1024, 1) AS index_mb
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'shop' AND TABLE_NAME = 'product';

image.png

약 120MB 정도 된다. 인덱스를 걸어보자.

CREATE INDEX idx_product_price ON product (price);

추가후 다시 인덱스 용량 확인

image.png

단일 컬럼 인덱스 하나 추가하는데 96MB 디스크를 추가로 썼다. 효과가 있을까? 쿼리를 다시 돌려보자.

참고로 인덱스 추가하고 바로 다시 용량 확인하면 캐시된 용량을 보여줘서 변화가 없다. 이때는

ANALYZE TABLE product;

등으로 테이블 정보를 최신화해줘야 한다.

인덱스가 생겼으니 다시 테스트해보자.

image.png