🦭 INDEX

λ‚˜λ‚˜'s BrainΒ·2024λ…„ 7μ›” 9일

MariaDB

λͺ©λ‘ 보기
15/15
post-thumbnail

πŸ“ INDEX

πŸ’‘ 인덱슀(Index)λŠ” 데이터 검색 속도λ₯Ό ν–₯μƒμ‹œν‚€λŠ” 데이터 ꡬ쑰둜 데이터λ₯Ό λΉ λ₯΄κ²Œ μ‘°νšŒν•  수 μžˆλŠ” 포인터λ₯Ό μ œκ³΅ν•œλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό 찾을 λ•Œ 전체 ν…Œμ΄λΈ”μ„ κ²€μƒ‰ν•˜λŠ” λŒ€μ‹  인덱슀λ₯Ό 톡해 검색을 ν•˜λ―€λ‘œ 속도가 더 λΉ¨λΌμ§€κ²Œ λœλ‹€.

μΈλ±μŠ€λŠ” 주둜 WHERE절의 μ‘°κ±΄μ΄λ‚˜ JOIN 연산에 μ‚¬μš©λ˜λŠ” μ»¬λŸΌμ— μƒμ„±ν•œλ‹€.

λ‹€λ§Œ μΈλ±μŠ€λ„ 데이터 μ €μž₯ 곡간을 μ°¨μ§€ν•˜κ³  데이터가 변경될 λ•Œλ§ˆλ‹€ 인덱슀 μ—­μ‹œ κ°±μ‹ ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μ–΄λ–€ μ»¬λŸΌμ— 인덱슀λ₯Ό μƒμ„±ν• μ§€λŠ” μ‹ μ€‘νžˆ κ²°μ •ν•΄μ•Ό ν•œλ‹€.


πŸ”– 인덱슀 생성

βœ… PRIMARY KEY μ œμ•½μ‘°κ±΄μ„ μ§€λ‹Œ κΈ°λ³Έ ν…Œμ΄λΈ” 생성 ν›„ κΈ°λ³Έ 데이터 INSERT ν›„ 쑰회

    CREATE TABLE phone (
        phone_code INT PRIMARY KEY,
        phone_name VARCHAR(100),
        phone_price DECIMAL(10, 2)
    );
    
    INSERT 
      INTO phone (phone_code , phone_name , phone_price )
    VALUES 
    (1, 'galaxyS23', 1200000),
    (2, 'iPhone14pro', 1433000),
    (3, 'galaxyZfold3', 1730000);
    
    SELECT * FROM phone;

βœ…μΈλ±μŠ€κ°€ μ—†λŠ” μ»¬λŸΌμ„ WHERE절의 쑰건으둜 ν™œμš©ν•œ 쑰회 μ§„ν–‰ μ‹œ EXPLAIN으둜 쿼리 μ‹€ν–‰ κ³„νš 확인

EXPLAIN SELECT * FROM phone WHERE phone_name = 'galaxyS23';

βœ… phone_name μ»¬λŸΌμ— idx_nameμ΄λΌλŠ” μ΄λ¦„μ˜ 인덱슀 생성 ν›„ 확인

    CREATE INDEX idx_name ON phone (phone_name);

2개 μ΄μƒμ˜ μ»¬λŸΌμ„ ν•œλ²ˆμ— ν•˜λ‚˜μ˜ 인덱슀둜 μ„€μ •ν•΄μ„œ 생성할 수 μžˆλ‹€.
βœ… 볡합 인덱슀 생성

    CREATE INDEX idx_name_price ON phone (phone_name, phone_price);
    
    SHOW INDEX FROM phone;

πŸ”– 인덱슀 ν™œμš©

βœ… ν…Œμ΄λΈ”μ— μΈλ±μŠ€κ°€ μ„€μ • 된 μ»¬λŸΌμ„ ν™œμš©ν•΄ 쑰회λ₯Ό μ§„ν–‰

    SELECT * FROM phone WHERE phone_name = 'iPhone14pro';

βœ… EXPLAIN λͺ…λ Ήμ–΄λ‘œ 쿼리 μ‹€ν–‰ κ³„νš 확인(인덱슀 μ‚¬μš© μ—¬λΆ€ 및 μ‚¬μš© 컬럼 확인)

    EXPLAIN SELECT * FROM phone WHERE phone_name = 'iPhone14pro';

➑️ 인덱슀 μ΅œμ ν™”(μž¬κ΅¬μ„±)

  • 인덱슀 μ΅œμ ν™”(μž¬κ΅¬μ„±)은 μΈλ±μŠ€κ°€ νŒŒνŽΈν™”λ˜μ—ˆκ±°λ‚˜, λ°μ΄ν„°μ˜ λŒ€λΆ€λΆ„μ΄ λ³€κ²½λœ κ²½μš°μ— μœ μš©ν•˜λ‹€.
  • μ΄λŠ” 인덱슀의 μ„±λŠ₯을 κ°œμ„ ν•˜κ³ , λ””μŠ€ν¬ 곡간을 더 효율적으둜 μ‚¬μš©ν•˜κ²Œ ν•΄μ€€λ‹€.
  • 단, 인덱슀λ₯Ό μž¬κ΅¬μ„±ν•˜λŠ” λ™μ•ˆ ν•΄λ‹Ή ν…Œμ΄λΈ”μ€ 잠길 수 μžˆμœΌλ―€λ‘œ, 이 μž‘μ—…μ€ μ£Όμ˜ν•΄μ„œ μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€.
  • ALTER TABLE λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄μ„œ μž¬κ΅¬μ„±ν•œλ‹€.
    ALTER TABLE phone DROP INDEX idx_name;
    ALTER TABLE phone ADD INDEX idx_name(phone_name);

λ˜ν•œ, MySQL의 InnoDB 엔진을 μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” OPTIMIZE TABLE λͺ…령을 μ‚¬μš©ν•˜μ—¬ ν…Œμ΄λΈ”κ³Ό 인덱슀λ₯Ό μ΅œμ ν™”ν•  μˆ˜λ„ μžˆλ‹€.

    OPTIMIZE TABLE phone;

πŸ”– 인덱슀 μ‚­μ œ

βœ… 인덱슀 μ‚­μ œ ν›„ ν…Œμ΄λΈ”μ— μ‘΄μž¬ν•˜λŠ” 인덱슀 확인

    DROP INDEX idx_name ON phone;
    SHOW INDEX FROM phone;
profile
"λ‘œμ»¬μ—μ„  λ¬Έμ œμ—†μ—ˆλŠ”λ°β€¦?"

0개의 λŒ“κΈ€