inblog logo
|
jjack1
    데이터베이스MySQL

    [DB] 12. 인덱스 Ⅳ. 인덱스 실습

    최재원's avatar
    최재원
    Mar 05, 2025
    [DB] 12. 인덱스 Ⅳ. 인덱스 실습
    Contents
    1. 더미 데이터 세팅2. 더미 데이터 확인3. 풀스캔4. 인덱스 스캔 - primary key5. 인덱스 스캔 - unique key6. 인덱스 스캔7. 인덱스 스캔 - range scan8. 자투리
    notion image
    notion image

    1. 더미 데이터 세팅

    create table member_tb( id int primary key auto_increment, gender char(1), nickname varchar(20), age int, money int );
    DELIMITER $$ DROP PROCEDURE IF EXISTS insertDummyData$$ CREATE PROCEDURE insertDummyData() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 1000000 DO IF mod(i,2) = 1 THEN INSERT INTO member_tb(gender, nickname, age, money) VALUES('M', concat('닉네임', i), FLOOR(1 + RAND() * 60),FLOOR(10000 + RAND() * 100000)); ELSE INSERT INTO member_tb(gender, nickname, age, money) VALUES('F', concat('닉네임', i), FLOOR(1 + RAND() * 60),FLOOR(10000 + RAND() * 100000)); END IF; SET i = i + 1; END WHILE; END$$ DELIMITER $$
    CALL insertDummyData;

    2. 더미 데이터 확인

    SELECT * FROM MEMBER_TB;
    notion image
    notion image

    3. 풀스캔

    SELECT * FROM member_tb WHERE NICKNAME = '닉네임7'; -- 0.235초
    notion image
    notion image

    4. 인덱스 스캔 - primary key

    SELECT * FROM member_tb WHERE ID = 7; -- 0.000초
    notion image
    notion image

    5. 인덱스 스캔 - unique key

    alter table member_tb add constraint uk_nickname unique (nickname); -- 1.7초 select * from member_tb where nickname = '닉네임9'; -- 0.000초, single row
    notion image

    6. 인덱스 스캔

    -- 비지니스상 해당 컬럼을 조회할 일이 '자주' 있어야 함 -- 중복된 데이터가 15% 이하일 경우, 중복 비중이 적을 경우 create index nickname_idx on member_tb (nickname); -- 왜 닉네임7을 조회하면 안되는가? - 캐싱되어있음 (LRU 알고리즘) select * from member_tb where nickname = '닉네임8'; -- 0.000초0
    notion image

    7. 인덱스 스캔 - range scan

    create index money_idx on member_tb (money); -- 0.860초 select * from member_tb where money between 30000 and 40000; -- 0.000초, index range scan
    notion image

    8. 자투리

    -- 인덱스 삭제 & unique 생성 drop index nickname_idx on member_tb; select * from member_tb where money between 10000 and 20000; -- 0.000초, full scan -- 인덱스로 행을 걸러내고 그 결과를 가지고 평균을 구한다. select avg(age) from member_tb where money between 30000 and 40000; -- 0.438초 drop index money_idx on member_tb; drop index money_age_idx on member_tb; drop index uk_nickname on member_tb; -- 연관된 2가지의 컬럼을 인덱싱 한다. create index money_age_idx on member_tb (money, age); -- 1초 -- 인덱스로 행을 걸러니면서 평균을 구한다. 그리고 그 결과를 바로 보여줌 select avg(age) from member_tb where money between 10000 and 20000; -- 0.031초
    Share article

    jjack1

    RSS·Powered by Inblog