[MariaDB] Index

chaeyeongΒ·2025λ…„ 2μ›” 4일

SQL

λͺ©λ‘ 보기
4/6

πŸ“‡ Index

πŸ’‘ μΈλ±μŠ€λŠ” ν…Œμ΄λΈ”μ—μ„œ 검색 속도λ₯Ό ν–₯μƒμ‹œν‚€κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ μ‘΄μž¬ν•œλ‹€. μΈλ±μŠ€λŠ” 물리적인 μœ„μΉ˜μ— λŒ€ν•œ 정보λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

  • PK, FK 컬럼 μ§€μ • μ‹œμ— μΈλ±μŠ€κ°€ μžλ™μœΌλ‘œ μƒμ„±λœλ‹€.
  • 주둜 WHERE절의 μ‘°κ±΄μ΄λ‚˜ JOIN 연산에 μƒμ„±ν•œλ‹€.

πŸ’‘ μΈλ±μŠ€κ°€ 항상 쒋은 κ²ƒλ§Œμ€ μ•„λ‹ˆλ‹€.

  • 데이터 변경사항에 따라 μΈλ±μŠ€λ„ λ³€κ²½λ˜μ–΄μ•Ό ν•œλ‹€λŠ” μ μ—μ„œ λ²ˆκ±°λ‘­λ‹€λŠ” 점이 μžˆλ‹€. 일뢀 데이터듀이 μ‚­μ œ 되면 ν…Œμ΄λΈ” λ‚΄λΆ€μ˜ 데이터 인덱슀λ₯Ό μ •λ ¬ν•œ ꡬ쑰가 ννŠΈλŸ¬μ§„λ‹€. 자료ꡬ쑰의 데이터가 편ν–₯되고 인덱슀의 μ˜μ˜κ°€ λ³€μ§ˆλ˜κΈ° λ•Œλ¬Έμ— κ²°κ΅­ νš¨μœ¨μ μ΄μ§€ μ•Šκ²Œ λœλ‹€. μΈλ±μŠ€λŠ” λ°μ΄ν„°μ˜ 변화에 따라 λ³€κ²½λ˜κ³  μž¬κ΅¬μ„± ν•΄μ•Όν•œλ‹€.

  • μΈλ±μŠ€λŠ” 물리적으둜 μ €μž₯λœλ‹€λŠ” μ μ—μ„œ μ €μž₯곡간을 μ°¨μ§€ν•˜κ²Œ λœλ‹€. 상황에 따라 μΈλ±μŠ€κ°€ νš¨μœ¨μ μΌμˆ˜λ„ 있고 ν’€μŠ€μΊ”μ΄ 효율적일 수 μžˆλ‹€. μ–΄λ–€ νŠΉμ • 컬럼이 쑰건 검색에 μ“°μ—¬μ„œ ν’€μŠ€μΊ”λ³΄λ‹€λŠ” μΈλ±μŠ€κ°€ λ‚˜μ„ 것 κ°™λ‹€ νŒλ‹¨μ΄ λ“œλŠ” κ²ƒλ§Œ 인덱슀λ₯Ό 생성해야 ν•œλ‹€.

Optimizer

  • νŒŒμ‹±μ— μ„±κ³΅ν•˜λ©΄ 쿼리 μ΅œμ ν™”κΈ°(optimizer)κ°€ μž‘λ™ν•œλ‹€. μ‚¬μš©ν•  인덱슀 κ²°μ •, 쑰인 μˆœμ„œ, 데이터λ₯Ό μ½λŠ” 방법 등을 ν¬ν•¨ν•˜μ—¬ β€˜μ‹€ν–‰ κ³„νšβ€™μ΄λΌλŠ” ν˜•νƒœλ‘œ μƒμ„±λœλ‹€.
  • μ˜΅ν‹°λ§ˆμ΄μ €λŠ” 쿼리λ₯Ό μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ κ°€μž₯ 효율적인 방법을 κ²°μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.
  • MariaDBμ—μ„œλŠ” 기본적으둜 CBOλ₯Ό μ‚¬μš©ν•˜λ©° RBOλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ˜΅ν‹°λ§ˆμ΄μ €μ˜ μ’…λ₯˜

1) λΉ„μš©κΈ°λ°˜ μ˜΅ν‹°λ§ˆμ΄μ €(Cost-Based Optimizer, CBO)

: 쿼리λ₯Ό μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λΉ„μš©μ„ μΆ”μ •ν•˜μ—¬ 쿼리 μ‹€ν–‰ κ³„νšμ„ μ„ νƒν•œλ‹€. 이 λΉ„μš©μ€ λ””μŠ€ν¬
I/O, CPU μ‚¬μš©λŸ‰ λ“±μ˜ μžμ› μ‚¬μš©μ„ κ³ λ €ν•˜κ³  λ°μ΄ν„°λ² μ΄μŠ€μ˜ 톡계 정보(ν…Œμ΄λΈ”μ˜ ν–‰ 수,
인덱슀의 μœ λ‹ˆν¬ν•œ κ°’ λ“±)λ₯Ό μ‚¬μš©ν•˜μ—¬ λΉ„μš©μ„ μΆ”μ •ν•œλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ‹€μ œ 상황을 더 잘 λ°˜μ˜ν•˜λŠ” 쿼리 μ‹€ν–‰ κ³„νšμ„ 선택할 수 μžˆλ‹€.

2) κ·œμΉ™κΈ°λ°˜ μ˜΅ν‹°λ§ˆμ΄μ €(Rule-Based Optimizer, RBO)

: κ³ μ •λœ μ„ΈνŠΈμ˜ κ·œμΉ™μ„ 기반으둜 쿼리 μ‹€ν–‰ κ³„νšμ„ κ²°μ •ν•œλ‹€. κ·œμΉ™μ€ κ°œλ°œμžλ‚˜ DBA(Database
Administrator)κ°€ μ„€μ •ν•  수 있으며 νŠΉμ • μƒν™©μ—μ„œ νŠΉμ • μœ ν˜•μ΄ 연산이 더 νš¨κ³Όμ μ΄λΌλŠ” κ²½ν—˜
적인 지식에 κΈ°λ°˜ν•΄ μ •ν•΄μ§„λ‹€.

μ‹€μ œ 데이터 λΆ„ν¬λ‚˜ 톡계λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ•Œλ•Œλ‘œ λΉ„νš¨μœ¨μ μΈ 쿼리 μ‹€ν–‰ κ³„νšμ„ 선택할 
수 μžˆλ‹€.

μ‹€ν–‰ κ³„νš

  • β€˜EXPLAIN’ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄ μ‹€ν–‰ κ³„νšμ„ 확인할 수 μžˆλ‹€.
  • 인덱슀 없이 ν™•μΈν•˜λ©΄ Extra : Using where
    • WHERE μ ˆμ„ μ‚¬μš©ν•˜μ—¬ 행을 ν•„ν„°λ§ν–ˆμŒμ„ λ‚˜νƒ€λ‚Έλ‹€.
EXPLAIN SELECT * FROM phone WHERE phone_name = 'galaxyS23';

  • 인덱슀 생성 ν›„ ν™•μΈν•˜λ©΄ Extra : Using Index condition (컬럼 데이터λ₯Ό 읽지 μ•Šκ³  인덱슀λ₯Ό 톡해 정보λ₯Ό μ–»μ—ˆμŒμ„ λ‚˜νƒ€λ‚Έλ‹€. 이λ₯Ό '컀버링 인덱슀'라고도 ν•œλ‹€.)


Index 생성

CREATE INDEX idx_name ON phone(phone_name); 

볡합 Index 생성

CREATE INDEX idx_name_price ON phone(phone_name, phone_price);

Index 쑰회

SHOW INDEX FROM phone;


λ°μ΄ν„°λ² μ΄μŠ€(μŠ€ν‚€λ§ˆ)에 μ‘΄μž¬ν•˜λŠ” 인덱슀 쑰회

SELECT * FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'menudb';

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

  • μΈλ±μŠ€μ— ν•΄λ‹Ήν•˜λŠ” 컬럼 값이 λ³€ν™”ν•˜λ©΄ μΈλ±μŠ€λ„ λ³€ν™”ν•΄μ•Ό ν•œλ‹€.
ALTER TABLE phone DROP INDEX idx_name;
ALTER TABLE ADD INDEX index_name(phone_name);

OPTIMIZE TABLE phone;
profile
κ·Έλž˜λ„ ν•΄μ•Όμ§€ μ–΄λ–‘ν•΄

0개의 λŒ“κΈ€