2023. 11. 25. 10:53γDatabase/DB μ€ν°λ
μ€μ λ‘ DBλ₯Ό λ€λ£¨κ² λλ μν©μμ λΉ μ§ μ μλ κ²μ΄ λ°λ‘ μΈλ±μ€μ΄λ€.
μΈλ±μ€λ₯Ό ν΅νλ©΄ νΉμ 쑰건μμ λ°μ΄ν°μ μ‘°ν μ±λ₯μ΄ λΉμ½μ μΌλ‘ μ¦κ°νλ€λ κ²μ λꡬλ μκ³ μλ μ¬μ€μ΄λ€.
κ·Έλ¬λ©΄μλ, μΈλ±μ€λ₯Ό λ¨λ°νλ©΄ μλλ€λ κ² λν λ€λ€ μκ³ μλ€.
μ΄ λ λ±μ₯νλ λ Όλ¦¬κ° λ°λ‘ μΈλ±μ€κ° μ°¨μ§νλ 곡κ°μ λΉμ©κ³Ό λ°μ΄ν° μ½μ μ μΆκ°μ μΌλ‘ λ°μνλ μκ°μ λΉμ©μ λν λΉμ€μ 무μν μ μλ€λ κ²μ΄λ€.
κ·Έλ°λ° λ§μ μ΄λ κ² κ²λ§ μ£Όκ³ μ€μ λ‘ κ·Έ μ λκ° μ΄λ μ λμΈμ§ μλ €μ£Όλ μλ£λ λ§μ΄ μμ΄μ μ΄μ λν΄ μ€μ λ‘ νμΈν΄λ³΄λ €κ³ νλ€.
ν μ€νΈ νκ²½μ Mysqlμ΄κ³ , μλ¬΄λ° λ¦΄λ μ΄μ μ΄ μ‘΄μ¬νμ§ μλ λ 립λ ν μ΄λΈμμ ν μ€νΈλ₯Ό μ§ννμλ€.
-- ν
μ΄λΈ μμ±
create table item (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(25) NOT NULL,
is_for_sale BOOLEAN NOT NULL,
price BIGINT NOT NULL,
created_at TIMESTAMP NOT NULL,
PRIMARY KEY(id)
);
-- λλ―Έ λ°μ΄ν° μ½μ
DELIMITER //
CREATE PROCEDURE insert_dummy_data()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < 100000 DO
INSERT INTO item (name, is_for_sale, price, created_at)
VALUES (
CONCAT('Item', FLOOR(1 + (RAND() * 99999))), -- λλ€ μμ΄ν
μ΄λ¦ μμ±
RAND() < 0.5, -- λλ€μΌλ‘ TRUE λλ FALSE
FLOOR(1 + (RAND() * 99999)), -- λλ€ κ°κ²©
DATE_ADD(NOW(), INTERVAL -FLOOR(RAND() * 730) DAY) -- νμ¬λ‘λΆν° μ΅λ 2λ
μ μ λλ€ λ μ§
);
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL insert_dummy_data();
1. μΈλ±μ€κ° μ°¨μ§νλ 곡κ°μ λΉμ©
μ 쿼리λ₯Ό 보면 μ μ μλ―μ΄, νμ¬ ν μ΄λΈμλ μ΄ 10λ§κ°μ λ°μ΄ν°κ° μΆκ°λμ΄μλ€. μ΄ λ ν΄λΉ ν μ΄λΈμ΄ μ°¨μ§νλ μ©λμ λλ΅ 5.52MB μ λμ΄λ€. μλ 쿼리λ₯Ό ν΅ν΄ νμΈ κ°λ₯νλ€.
select * from information_schema.TABLES where table_name = 'item';
μ΄μ , name μΉΌλΌμ μΈλ±μ€λ₯Ό μΆκ°νλ μν©μ κ°μ ν λ€, μΈλ±μ€λ₯Ό μΆκ°ν΄μ£Όκ³ ,
create index item_name_idx on item (name);
κ·Έ ν μλ 쿼리λ₯Ό ν΅ν΄ ν΄λΉ μΈλ±μ€κ° μ°¨μ§νλ μ©λμ νμΈν΄λ³΄λ©΄, λλ΅ 3.52MB μ λμ΄λ€.
select
stat_value * @@innodb_page_size as index_size
from mysql.innodb_index_stats
where stat_name = 'size' and table_name = 'item' and index_name = 'item_name_idx';
νλμ μΉΌλΌμ ν΅ν΄ μΈλ±μ€λ₯Ό μμ±νλλΌλ, ν μ΄λΈ μ¬μ΄μ¦μ μ λ°μ΄ λλ ν¬κΈ°λ₯Ό μΈλ±μ€κ° μ°¨μ§ν¨μ μ μ μλ€.
κ·Έλ λ€λ©΄ μ΄λ²μλ λ°μ΄ν°μ λΆν¬κ° True, False λΏμΈ Boolean νμ μ μΈλ±μ€λ₯Ό μμ±νλ©΄ μ΄λ»κ² λ κΉ?
μ΄λ₯Ό μν΄ μ΄λ²μλ item_is_sale_idxλΌλ μ΄λ¦μ μΈλ±μ€λ₯Ό μλ‘κ² μΆκ°ν΄μ£Όμλ€.
create index item_is_sale_idx on item (is_for_sale_idx);
κ·Έ λ€ μμμ μ μν μΈλ±μ€ ν¬κΈ°λ₯Ό νμΈνλ 쿼리λ₯Ό μ€νμμΌ νμΈν΄λ³΄λ©΄, μ΄λ²μλ 2.52MBλ₯Ό μ°¨μ§νλ κ²μ μ μ μλ€.
name μΉΌλΌκ³Ό is_for_sale μΉΌλΌμ μ¬μ΄μ¦λ κ°κ° 25byte vs 1byteλ‘ μ°¨μ΄κ° ν¬κ² λλ κ²κ³Ό, λ°μ΄ν°μ λΆν¬κ° 0κ³Ό 1λΏμ΄λΌκ³ ν΄λ μ€μ§μ μΌλ‘ μΈλ±μ€κ° μ°¨μ§νλ ν¬κΈ°λ λ§μ΄ μ°¨μ΄κ° λμ§λ μλλ€.
λ§μ§λ§μΌλ‘ λ³΅ν© μΈλ±μ€μ λν΄ μμ보기 μν΄ (price, created_at) νμμΌλ‘ μΈλ±μ€λ₯Ό μμ±ν΄μ£Όμλ€.
create index item_price_created_at_idx on item (price, created_at);
κ·Έλ¦¬κ³ κ·Έ κ²°κ³Όλ, μ΄μ μ item_name_idxμ λμΌν 3.52MB μμ€μ΄λ€.
κ²°λ‘ μ μΌλ‘, ν μ΄λΈμ λΉν΄ μΈλ±μ€κ° μ°¨μ§νλ ν¬κΈ°λ κ²°μ½ λ¬΄μν μ μλ μ λμΈ κ²μΌλ‘ λλ¬λ¬λ€. λ¬Όλ‘ μΉΌλΌ μκ° μ μ ν μ΄λΈλ‘ ν μ€νΈνμ¬ λ λ§μ ν μ΄λΈμ΄μλ€λ©΄ μ°¨μ΄κ° λ λ§μ΄ λ¬κ² μ§λ§ κ·ΈλΌμλ λΆκ΅¬νκ³ κ½€ 무κ²λ€λ건 체κ°μ΄ λλ μμ€.
2. μΈλ±μ€λ‘ μΈν΄ λ°μνλ μκ°μ λΉμ©
μΈλ±μ€λ κΈ°λ³Έμ μΌλ‘ B+TreeλΌλ μλ£κ΅¬μ‘°λ₯Ό μ¬μ©νλ€. ν΄λΉ μλ£κ΅¬μ‘°λ νμ κ· νμ‘ν μν(λͺ¨λ 리νλ ΈλκΉμ§μ νμ λΉμ©μ΄ λμΌ)λ₯Ό μ μ§νλ νΉμ±μ΄ μλλ°, μ΄λ‘ μΈν΄ DBλ μΌκ΄λ νμ μ±λ₯μ λ°νν μ μλ€.
λ€λ§ μ΄λ¬ν νΉμ±μ μ μ§νκΈ° μν΄ λ°μ΄ν°(μΈλ±μ€)μ μΆκ° λ° μ κ±°, μμ μ λ°λΌ νΈλ¦¬μ κ΅¬μ‘°κ° κ³μν΄μ μμ λλ μλ£ κ΅¬μ‘°μ΄κΈ°λ νλ€. μ΄ λλ¬Έμ μΈλ±μ€ μΆκ° μ DMLμ μ±λ₯μ΄ μ νλλ€.
μ΄λ²μλ μ΄ μ±λ₯μ΄ κ³Όμ° μΌλ§λ§νΌ μ νλλμ§ μ§μ 쿼리λ₯Ό μ€νν΄λ³΄λ©΄μ νμΈν΄λ³΄κ³ μ νλ€.
μ°μ ν μ΄λΈ λ² μ΄μ€λ μμμ μ΄μ©νλ ν μ΄λΈ λ² μ΄μ€λ₯Ό κ·Έλλ‘ μ¬μ©νλλ‘ νκ³ , λλ―Έ λ°μ΄ν°λ₯Ό μΆκ°νλ 쿼리μ μμ μκ°μ μΈ‘μ νλ μμΌλ‘ νμΈν΄λ³΄κ² λ€.
κΈ°μ‘΄μ λ£μ΄λλ λ°μ΄ν°λ₯Ό λͺ¨λ μμ νκ³ λ€μ 10λ§κ°μ λ°μ΄ν°λ₯Ό μμ±ν΄μ£Όμλ€. μ΄ λ μΈλ±μ€λ PKλ₯Ό μ μΈνκ³ λ μ€μ νμ§ μμ μν.
κ·Έ λ€ λ°μ΄ν°λ₯Ό μ λΆ λ λ¦¬κ³ , name μΉΌλΌμ μΈλ±μ€λ₯Ό κ±Έμ΄ μ€ λ€μ λ€μ λλ―Έ λ°μ΄ν° μμ± μΏΌλ¦¬λ₯Ό μλμμΌ°λ€.
μλ κ²κ³Ό λ¬λ¦¬, μ±λ₯μ΄ λΉμ·νλ€. (μ¬μ€ λ λΉ λ₯΄λ€)
λ€λ§ λ λΉ λ₯΄λ€κ³ κ²°λ‘ μ λ΄λ κ²μ λ§μ΄ μλκ³ , κ±°μ μ°¨μ΄κ° μλ€κ³ 보λκ² λ§λ κ² κ°λ€. μΆκ°μ μΈ μμ μ΄ μ΄λ£¨μ΄μ§λ κ²μ μλͺ νμ§λ§ νμ¬μ ν μ€νΈ νκ²½μΌλ‘λ κ·Έ κ²μ΄ λΆκ°λ μ λλ μλλ―.
'Database > DB μ€ν°λ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Buffer Pinning κΈ°λ² (in Oracle) (0) | 2023.12.09 |
---|---|
ν μ΄λΈ μ€μΊ λ°©μμ λ°λ₯Έ DB Block IO μ λ΅ (Single vs Multi) (1) | 2023.12.02 |
DB μ€νκ³ν νμΈλ²(in PostgreSQL) (1) | 2023.11.11 |
RDB vs NoSQL (0) | 2023.02.18 |
νΈλμμ 격리 μμ€ (0) | 2023.02.17 |