Skip to content

GIHYUN-LEE/partitioningProject

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

27 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ§ͺ ν”„λ‘œμ νŠΈ

연체 이λ ₯ 데이터λ₯Ό 기반으둜 νŒŒν‹°μ…”λ‹ 방식(RANGE, LIST, HASH λ“±)을 μ μš©ν•˜κ³ , 방식별 쿼리 μ„±λŠ₯을 λΆ„μ„ν•œ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.


πŸ‘₯νŒ€μ†Œκ°œ

μ΄μ œν˜„ 김동민 μ΄κΈ°ν˜„ μž₯μ†‘ν•˜
lyjh98 kddmmm GIHYUN-LEE jangongha
Image Image Image Image

πŸ“Œ νŒŒν‹°μ…”λ‹μ΄λž€

  • λ…Όλ¦¬μ μœΌλ‘œλŠ” ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ„, 물리적으둜 μ—¬λŸ¬ ν…Œμ΄λΈ”λ‘œ λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
  • λŒ€μš©λŸ‰ ν…Œμ΄λΈ”μ„ λΆ„ν• ν•˜μ—¬ μ„±λŠ₯ ν–₯상 및 관리 μš©μ΄μ„± 확보 λ“±μ˜ νš¨κ³Όκ°€ μžˆμŠ΅λ‹ˆλ‹€.
  • νŒŒν‹°μ…”λ‹ ν•™μŠ΅

🎯 λͺ©μ 

  • MySQL νŒŒν‹°μ…”λ‹ 방식(RANGE, LIST, HASH, KEY) 이해
  • 단일 νŒŒν‹°μ…”λ‹κ³Ό 볡합 νŒŒν‹°μ…”λ‹μ˜ μ„±λŠ₯ 차이 비ꡐ 및 뢄석
  • νŒŒν‹°μ…”λ‹ 방식별 PROCEDUREλ₯Ό 톡해 μ„±λŠ₯ 차이 비ꡐ 및 뢄석

βš™οΈ μ„±λŠ₯ ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€

ꡬ뢄 λ‚΄μš©
μΈ‘μ • ν•­λͺ© 쿼리 μ‹€ν–‰μ‹œκ°„
μΈ‘μ • λŒ€μƒ 일반 ν…Œμ΄λΈ” 및 νŒŒν‹°μ…”λ‹ 적용 ν…Œμ΄λΈ” 8개
(Range,List,Hash,Key,Range-Hash,Range-Key,List-Hash,List-Key)
비ꡐ 쑰건 1. νŒŒν‹°μ…”λ‹ 적용 μœ λ¬΄μ— λ”°λ₯Έ 차이
2. 단일 νŒŒν‹°μ…”λ‹ 방식별 차이
3. 볡합 νŒŒν‹°μ…”λ‹ 방식별 차이
사전 쑰건 λŒ€μƒ ν…Œμ΄λΈ” 9κ°œμ— λ™μΌν•œ 데이터(10만건) μ‚½μž…
μž…λ ₯ 쑰건 동일 쑰회쿼리 500회 반볡 μž…λ ₯
절        차 1. λŒ€μƒ ν…Œμ΄λΈ”μ— μž…λ ₯ 쑰건 3회 μ‹€ν–‰
2. QueryManager둜 μ‹€ν–‰μ‹œκ°„ 평균값 λ„μΆœ
3. Mysqlμ„œλ²„ μž¬μ‹œμž‘
4.λ‚˜λ¨Έμ§€ ν…Œμ΄λΈ”μ— 반볡 μ‹€ν–‰

πŸ› οΈ ν…ŒμŠ€νŠΈ ν™˜κ²½

  • DBMS: MySQL 8.2.0
  • Tool: DBeaver, MySQL
  • OS: Windows 10 / Ubuntu 22.04

πŸ“‚ 데이터 μ…‹

데이터 좜처: https://www.aihub.or.kr 의 금육 데이터(νšŒμ›μ •λ³΄, μž”μ•‘μ •λ³΄) μ΄μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

데이터 크기 : 총 100,000건 | 파일 크기 : 5.6MB (csv, UTF-8 인코딩)

μ „μ²˜λ¦¬ κ³Όμ •

1. python을 μ΄μš©ν•œ ν…Œμ΄λΈ” 생성
μ‚¬μš©μžλ³„ 연체 μœ„ν—˜λ„λ₯Ό ν‘œμ‹œν•˜κΈ° μœ„ν•΄ 연체 κ΄€λ ¨ 컬럼(일자, μž”μ•‘ λ“±)κ³Ό νšŒμ›μ •λ³΄λ₯Ό μΆ”μΆœν•˜μ—¬ λ³‘ν•©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

2. λ°œκΈ‰νšŒμ›λ²ˆν˜Έ format
λ°œκΈ‰νšŒμ›λ²ˆν˜Έμ˜ 값이 SYN_0ν˜•νƒœμ˜ varcharνƒ€μž…μœΌλ‘œ μ œκ³΅λ˜μ–΄ μžˆμ–΄ INT ν˜•μ‹μœΌλ‘œ ν¬λ©§ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  -- SYN_0 으둜 제곡된 κ°’ -> 0 으둜 λ³€κ²½
  UPDATE real_dataset SET λ°œκΈ‰νšŒμ›λ²ˆν˜Έ = REPLACE(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 'SYN_', '');

  -- 0,1,2 .. 으둜 λ³€κ²½λœ κ°’ INT νƒ€μž…μœΌλ‘œ νƒ€μž…λ³€κ²½
  ALTER TABLE real_dataset MODIFY COLUMN λ°œκΈ‰νšŒμ›λ²ˆν˜Έ INT;

3. PK μ„€μ •
νŒŒν‹°μ…˜ 및 μ„œλΈŒνŒŒν‹°μ…˜ KEY둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 볡합PK μ„€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  -- λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도 primary key둜 등둝
  ALTER TABLE real_dataset ADD PRIMARY KEY (λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도);

4. 데이터 μ‚½μž…

-- ν…Œμ΄λΈ”λ³„ 데이터 μ‚½μž…
INSERT INTO νŒŒν‹°μ…˜ν…Œμ΄λΈ”λͺ…
 (λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ, μ—°λ Ή, κ±°μ£Όμ‹œλ„λͺ…, μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M, μ—°μ²΄μΌμž_B0M, μ—°μ²΄μž”μ•‘_B0M, μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M, μ—°μ²΄μž”μ•‘_ν• λΆ€_B0M, 연체연도)
 SELECT λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ, μ—°λ Ή, κ±°μ£Όμ‹œλ„λͺ…, μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M, μ—°μ²΄μΌμž_B0M, μ—°μ²΄μž”μ•‘_B0M, μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M, μ—°μ²΄μž”μ•‘_ν• λΆ€_B0M, 연체연도
 FROM real_dataset;

μ΅œμ’… ν…Œμ΄λΈ” ꡬ쑰

컬럼λͺ… 데이터 νƒ€μž… 데이터 ν˜•μ‹
λ°œκΈ‰νšŒμ›λ²ˆν˜Έ INT (PK) 0 ,1, 2...
연체연도 INT (PK) 2000,2001...
μ—°μ²΄μΌμž_B0M DATE 2002-02-10, 2024-10-30, ...
λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ INT 1(남),2(μ—¬),1(남),...
μ—°λ Ή VARCHAR(20) 10λŒ€, 20λŒ€,30λŒ€,..
κ±°μ£Όμ‹œλ„λͺ… VARCHAR(20) μ„œμšΈ,λΆ€μ‚°,..
μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M INT 100,220 ,123,321...
μ—°μ²΄μž”μ•‘_B0M INT 100,000 , 200,100...
μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M INT 123,321...
μ—°μ²΄μž”μ•‘_ν• λΆ€ INT 0, 133,122...

✍️ νŒŒν‹°μ…”λ‹ 적용 ν…Œμ΄λΈ” μ œμž‘

1. νŒŒν‹°μ…”λ‹ κΈ°μ€€

  • νŒŒν‹°μ…˜ 개수 5개둜 λΆ„ν• (단일 νŒŒν‹°μ…”λ‹ 5개, 볡합 νŒŒν‹°μ…”λ‹ 25개)
  • νŒŒν‹°μ…˜ ν‚€ : λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도

2. νŒŒν‹°μ…”λ‹ ν…Œμ΄λΈ” 정보 확인 쿼리

  SELECT
    TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, PARTITION_METHOD, SUBPARTITION_METHOD, TABLE_ROWS
  FROM
    information_schema.PARTITIONS
    WHERE TABLE_NAME='ν…Œμ΄λΈ”λͺ…';
  

3. μ•„λž˜ ν…Œμ΄λΈ”μ€ μ΅œμ’… ν…Œμ΄λΈ” 셋을 ν† λŒ€λ‘œ νŒŒν‹°μ…”λ‹μ„ μ μš©ν•œ ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.

1. LIST νŒŒν‹°μ…”λ‹

1-1. LIST νŒŒν‹°μ…”λ‹
CREATE TABLE list (
  λ°œκΈ‰νšŒμ›λ²ˆν˜Έ INT,
  λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ INT,
  μ—°λ Ή VARCHAR(20),
  κ±°μ£Όμ‹œλ„λͺ… VARCHAR(20),
  μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μΌμž_B0M DATE,
  연체연도 INT,
  μ—°μ²΄μž”μ•‘_B0M INT,
  μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μž”μ•‘_ν• λΆ€_B0M INT,
  primary key(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도)
) PARTITION BY LIST (연체연도)(
  	PARTITION P2005 VALUES IN (2000,2001, 2002, 2003, 2004),
  	PARTITION P2010 VALUES IN (2005, 2006, 2007, 2008, 2009),
  	PARTITION P2015 VALUES IN (2010, 2011, 2012, 2013, 2014),
  	PARTITION P2020 VALUES IN (2015, 2016, 2017, 2018, 2019),
  	PARTITION P2025 VALUES IN (2020, 2021, 2022, 2023, 2024, 2025)
  );

LIST νŒŒν‹°μ…”λ‹ 적용 ν…Œμ΄λΈ” 확인 리슀트 νŒŒν‹°μ…”λ‹ 확인

1-2. LIST-HASH νŒŒν‹°μ…”λ‹
CREATE TABLE list_hash (
  λ°œκΈ‰νšŒμ›λ²ˆν˜Έ INT,
  λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ INT,
  μ—°λ Ή VARCHAR(20),
  κ±°μ£Όμ‹œλ„λͺ… VARCHAR(20),
  μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μΌμž_B0M DATE,
  연체연도 INT,
  μ—°μ²΄μž”μ•‘_B0M INT,
  μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μž”μ•‘_ν• λΆ€_B0M INT,
  primary key(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도)
) PARTITION BY list (연체연도)
  SUBPARTITION BY hash(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ)
  SUBPARTITIONS 5(
  	PARTITION P2005 VALUES IN (2000,2001, 2002, 2003, 2004),
  	PARTITION P2010 VALUES IN (2005, 2006, 2007, 2008, 2009),
  	PARTITION P2015 VALUES IN (2010, 2011, 2012, 2013, 2014),
  	PARTITION P2020 VALUES IN (2015, 2016, 2017, 2018, 2019),
  	PARTITION P2025 VALUES IN (2020, 2021, 2022, 2023, 2024, 2025)
  );

LIST-HASH νŒŒν‹°μ…”λ‹ 적용 ν…Œμ΄λΈ” 확인 리슀트-해쉬 νŒŒν‹°μ…”λ‹ 확인

1-3. LIST-KEY νŒŒν‹°μ…”λ‹

CREATE TABLE list_key (
  λ°œκΈ‰νšŒμ›λ²ˆν˜Έ INT,
  λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ INT,
  μ—°λ Ή VARCHAR(20),
  κ±°μ£Όμ‹œλ„λͺ… VARCHAR(20),
  μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μΌμž_B0M DATE,
  연체연도 INT,
  μ—°μ²΄μž”μ•‘_B0M INT,
  μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μž”μ•‘_ν• λΆ€_B0M INT,
  primary key(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도)
) PARTITION BY list (연체연도)
  SUBPARTITION BY key(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ)
  SUBPARTITIONS 5(
  	PARTITION P2005 VALUES IN (2000,2001, 2002, 2003, 2004),
  	PARTITION P2010 VALUES IN (2005, 2006, 2007, 2008, 2009),
  	PARTITION P2015 VALUES IN (2010, 2011, 2012, 2013, 2014),
  	PARTITION P2020 VALUES IN (2015, 2016, 2017, 2018, 2019),
  	PARTITION P2025 VALUES IN (2020, 2021, 2022, 2023, 2024, 2025)
  );

LIST-KEY νŒŒν‹°μ…”λ‹ 적용 ν…Œμ΄λΈ” 확인 리슀트-ν‚€ νŒŒν‹°μ…”λ‹ 확인

2. RANGE νŒŒν‹°μ…”λ‹

2-1. RANGE νŒŒν‹°μ…”λ‹
CREATE TABLE p_range (
  λ°œκΈ‰νšŒμ›λ²ˆν˜Έ INT,
  λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ INT,
  μ—°λ Ή VARCHAR(20),
  κ±°μ£Όμ‹œλ„λͺ… VARCHAR(20),
  μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μΌμž_B0M DATE,
  연체연도 INT,
  μ—°μ²΄μž”μ•‘_B0M INT,
  μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μž”μ•‘_ν• λΆ€_B0M INT,
  primary key(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도)
) PARTITION BY range (연체연도)(
  	PARTITION P2005 VALUES LESS THAN (2005),
  	PARTITION P2010 VALUES LESS THAN (2010),
  	PARTITION P2015 VALUES LESS THAN (2015),
  	PARTITION P2020 VALUES LESS THAN (2020),
  	PARTITION P2025 VALUES LESS THAN MAXVALUE
  );

RANGE νŒŒν‹°μ…”λ‹ 적용 ν…Œμ΄λΈ” 확인 λ ˆμΈμ§€ νŒŒν‹°μ…”λ‹ 확인

2-2. RANGE-HASH νŒŒν‹°μ…”λ‹
CREATE TABLE range_hash (
  λ°œκΈ‰νšŒμ›λ²ˆν˜Έ INT,
  λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ INT,
  μ—°λ Ή VARCHAR(20),
  κ±°μ£Όμ‹œλ„λͺ… VARCHAR(20),
  μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μΌμž_B0M DATE,
  연체연도 INT,
  μ—°μ²΄μž”μ•‘_B0M INT,
  μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μž”μ•‘_ν• λΆ€_B0M INT,
  primary key(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도)
) PARTITION BY range (연체연도)
  SUBPARTITION BY HASH(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ)
  SUBPARTITIONS 5(
  	PARTITION P2005 VALUES LESS THAN (2005),
  	PARTITION P2010 VALUES LESS THAN (2010),
  	PARTITION P2015 VALUES LESS THAN (2015),
  	PARTITION P2020 VALUES LESS THAN (2020),
  	PARTITION P2025 VALUES LESS THAN MAXVALUE
  );

RANGE-HASH νŒŒν‹°μ…”λ‹ 적용 ν…Œμ΄λΈ” 확인 λ ˆμΈμ§€-해쉬 νŒŒν‹°μ…”λ‹ 확인

2-3. RANGE-KEY νŒŒν‹°μ…”λ‹

CREATE TABLE range_key (
  λ°œκΈ‰νšŒμ›λ²ˆν˜Έ INT,
  λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ INT,
  μ—°λ Ή VARCHAR(20),
  κ±°μ£Όμ‹œλ„λͺ… VARCHAR(20),
  μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μΌμž_B0M DATE,
  연체연도 INT,
  μ—°μ²΄μž”μ•‘_B0M INT,
  μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μž”μ•‘_ν• λΆ€_B0M INT,
  primary key(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도)
) PARTITION BY range (연체연도)
  SUBPARTITION BY key(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ)
  SUBPARTITIONS 5(
  	PARTITION P2005 VALUES LESS THAN (2005),
  	PARTITION P2010 VALUES LESS THAN (2010),
  	PARTITION P2015 VALUES LESS THAN (2015),
  	PARTITION P2020 VALUES LESS THAN (2020),
  	PARTITION P2025 VALUES LESS THAN MAXVALUE
  );

RANGE-KEY νŒŒν‹°μ…”λ‹ 적용 ν…Œμ΄λΈ” 확인 λ ˆμΈμ§€-ν‚€ νŒŒν‹°μ…”λ‹

3. HASH νŒŒν‹°μ…”λ‹

CREATE TABLE hash (
  λ°œκΈ‰νšŒμ›λ²ˆν˜Έ INT,
  λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ INT,
  μ—°λ Ή VARCHAR(20),
  κ±°μ£Όμ‹œλ„λͺ… VARCHAR(20),
  μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μΌμž_B0M DATE,
  연체연도 INT,
  μ—°μ²΄μž”μ•‘_B0M INT,
  μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μž”μ•‘_ν• λΆ€_B0M INT,
  primary key(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도)
) PARTITION BY hash (연체연도)
  PARTITIONS 5;

HASH νŒŒν‹°μ…”λ‹ 적용 ν…Œμ΄λΈ” 확인 해쉬 νŒŒν‹°μ…”λ‹ 확인

4. KEY νŒŒν‹°μ…”λ‹

CREATE TABLE p_key (
  λ°œκΈ‰νšŒμ›λ²ˆν˜Έ INT,
  λ‚¨λ…€κ΅¬λΆ„μ½”λ“œ INT,
  μ—°λ Ή VARCHAR(20),
  κ±°μ£Όμ‹œλ„λͺ… VARCHAR(20),
  μ›”μ€‘ν‰μž”_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μΌμž_B0M DATE,
  연체연도 INT,
  μ—°μ²΄μž”μ•‘_B0M INT,
  μ—°μ²΄μž”μ•‘_μΌμ‹œλΆˆ_B0M INT,
  μ—°μ²΄μž”μ•‘_ν• λΆ€_B0M INT,
  primary key(λ°œκΈ‰νšŒμ›λ²ˆν˜Έ, 연체연도)
) PARTITION BY key (연체연도)
  PARTITIONS 5;

KEY νŒŒν‹°μ…”λ‹ 적용 ν…Œμ΄λΈ” 확인 ν‚€ νŒŒν‹°μ…”λ‹


βŒ› μ‹€ν–‰ μ½”λ“œ

PROCEDUREλ₯Ό μ΄μš©ν•˜μ—¬ νŒŒν‹°μ…”λ‹ ν…Œμ΄λΈ” 별 500λ²ˆμ”© 연체연도 = 2000 and λ°œκΈ‰νšŒμ›λ²ˆν˜Έ=9945 쑰건을 μ‘°νšŒν•©λ‹ˆλ‹€.(μž„μ‹œμ„€μ •)

πŸ“Œ PROCEDURE λž€

  • 컴퓨터 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 일련의 λͺ…령어듀을 λͺ¨μ•„놓은 κ²ƒμž…λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ λͺ…λ Ήμ–΄ 집합은 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œμ„œ μž‘λ™ν•˜λ©°, 반볡적으둜 μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” μž‘μ—…λ“€μ„ 효율적으둜 μ²˜λ¦¬ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

PROCEDURE λ₯Ό μ΄μš©ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ

-- ν…ŒμŠ€νŠΈ ν”„λ‘œμ‹œμ Έ
CREATE PROCEDURE test()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < 500 DO
  SELECT * FROM ν…Œμ΄λΈ”λͺ… IGNORE INDEX (PRIMARY) WHERE 연체연도=2000 and λ°œκΈ‰νšŒμ›λ²ˆν˜Έ=9945;
  SET i = i + 1;
END WHILE;
END;

-- ν”„λ‘œμ‹œμ Έ 호좜
CALL test();

πŸ“ˆ μ„±λŠ₯ 비ꡐ κ²°κ³Ό

νŒŒν‹°μ…”λ‹ 방식별 ν…ŒμŠ€νŠΈ κ²°κ³Ό

νŒŒν‹°μ…”λ‹ 방식 평균 μ‹€ν–‰ μ‹œκ°„ (s) 단일 ν…Œμ΄λΈ” λŒ€λΉ„ μ„±λŠ₯ ν–₯상λ₯  (%)
νŒŒν‹°μ…”λ‹ 미적용 18s -
LIST 4.195s β–² 76.7%
LIST-HASH 1.01s β–² 94.4%
LIST-KEY 1.001s β–² 94.4%
RANGE 4.125s β–² 77.1%
RANGE-HASH 0.98s β–² 94.6%
RANGE-KEY 1.032s β–² 94.3%
HASH 4.531s β–² 74.8%
KEY 4.982s β–² 72.3%

νŒŒν‹°μ…”λ‹ 방식별 ν…ŒμŠ€νŠΈ 좜λ ₯ν™”λ©΄ 1. λ‹¨μΌν…Œμ΄λΈ” μ„±λŠ₯
νŒŒν‹°μ…˜ μ•ˆν•œ ν…Œμ΄λΈ” μ„±λŠ₯
2. LIST νŒŒν‹°μ…”λ‹
리슀트 νŒŒν‹°μ…”λ‹ ν…Œμ΄λΈ” μ„±λŠ₯
3. LIST-HASH νŒŒν‹°μ…”λ‹
리슀트-해쉬 νŒŒν‹°μ…”λ‹ μ„±λŠ₯
4. LIST-KEY νŒŒν‹°μ…”λ‹
리슀트-ν‚€ μ„±λŠ₯
5. RANGE νŒŒν‹°μ…”λ‹
λ ˆμΈμ§€ νŒŒν‹°μ…”λ‹ ν…Œμ΄λΈ” μ„±λŠ₯
6. RANGE-HASH νŒŒν‹°μ…”λ‹
λ ˆμΈμ§€-해쉬 μ„±λŠ₯
7. RANGE-KEY νŒŒν‹°μ…”λ‹
λ ˆμΈμ§€-ν‚€ νŒŒν‹°μ…”λ‹ μ„±λŠ₯
8. HASH νŒŒν‹°μ…”λ‹
해쉬 νŒŒν‹°μ…”λ‹ μ„±λŠ₯
9. KEY νŒŒν‹°μ…”λ‹
ν‚€ νŒŒν‹°μ…”λ‹ μ„±λŠ₯

πŸ” ν…ŒμŠ€νŠΈ 결과에 λŒ€ν•œ κ³ μ°°

βœ… 단일 ν…Œμ΄λΈ” λŒ€λΉ„ μ„±λŠ₯ ν–₯상

  • 단일 νŒŒν‹°μ…”λ‹ 의 경우 : μ•½ 75% ν–₯상 ν–ˆμŠ΅λ‹ˆλ‹€.
  • 볡합 νŒŒν‹°μ…”λ‹ 의 경우 : μ•½ 94% ν–₯상 ν–ˆμŠ΅λ‹ˆλ‹€.
  • 볡합 νŒŒν‹°μ…”λ‹μ€ 단일 νŒŒν‹°μ…”λ‹λ³΄λ‹€ μ•½ 77% ν–₯상 ν–ˆμŠ΅λ‹ˆλ‹€.

βœ… νŒŒν‹°μ…”λ‹ 방식별 μ„±λŠ₯

  • 단일 νŒŒν‹°μ…”λ‹ 의 경우 : RANGE
  • 볡합 νŒŒν‹°μ…”λ‹ 의 경우 : RANGE-HASH
  • 고렀사항 : νŒŒν‹°μ…”λ‹ 방식에 λ”°λ₯Έ μƒμ΄ν•œ 데이터 νƒ€μž…, λ°©λŒ€ν•œ 데이터 및 νŒŒν‹°μ…˜ 개수λ₯Ό κ³ λ €ν•΄μ•Όν•©λ‹ˆλ‹€.

⚠️ KEY νŒŒν‹°μ…”λ‹μ˜ μ˜ˆμ™Έμ  κ²°κ³Ό

  • 8개의 방식 쀑 μœ μΌν•˜κ²Œ 데이터가 κ· λ“±ν•˜κ²Œ λΆ„ν• λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
  • KEYλŠ” MySQL λ‚΄λΆ€μ˜ λΉ„κ³΅κ°œ ν•΄μ‹œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬, λΆ„μ‚° λ°©μ‹μ˜ 예츑이 λΆˆκ°€ ν•˜λ©° 데이터가 νŽΈμ€‘λ  수 μžˆμŠ΅λ‹ˆλ‹€.
ν‚€ νŒŒν‹°μ…”λ‹

βœ… κ²°λ‘ 

  • KEY νŒŒν‹°μ…”λ‹μ€ 데이터 νŠΉμ„± 및 뢄포에 λ―Όκ°ν•˜λ―€λ‘œ 싀무 적용 μ‹œ 주의 ν•„μš”ν•©λ‹ˆλ‹€.
  • 데이터 μ–‘κ³Ό νŒŒν‹°μ…˜ κ°œμˆ˜μ— λ”°λ₯Έ 뢄석 ν•„μš”ν•©λ‹ˆλ‹€.

πŸš€ νŠΈλŸ¬λΈ” μŠˆνŒ…

🧠 초기 아이디어 μ†Œν†΅ 였λ₯˜

Image
  • ν”„λ‘œμ νŠΈ 초반 아이디어λ₯Ό λ„μΆœν•˜κ³  μ •λ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ,λ™μΌν•œ 주제λ₯Ό λ°”λΌλ³΄λŠ” 관점과 해석이 κ΅¬μ„±μ›λ§ˆλ‹€ 달라 아이디어 선정에 μ‹œκ°„μ΄ κ±Έλ ΈμŠ΅λ‹ˆλ‹€.
  • ν•΄κ²° 방법
    • μ„œλ‘œκ°€ μƒκ°ν•˜λŠ” ν”„λ‘œμ νŠΈμ˜ λ°©ν–₯μ„±κ³Ό 핡심 λͺ©ν‘œμ— λŒ€ν•΄ ꡬ체적으둜 λŒ€ν™”ν•˜λŠ” μ‹œκ°„μ„ λ§ˆλ ¨ν•˜κ³ ,
      이λ₯Ό 톡해 각자의 관점과 해석 차이 μ΄ν•΄ν•˜λŠ” 단계λ₯Ό 톡해 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.
      βœ… ν•΄κ²° μ™„λ£Œ

🧹 데이터 import 이슈

  • csv νŒŒμΌμ„ UTF-8둜 μ €μž₯ν–ˆμŒμ—λ„ μ—…λ‘œλ“œ μ‹œ ν•œκΈ€ 깨짐 ν˜„μƒ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
  • ν•΄κ²° 방법
    • μ—…λ‘œλ“œ μ „ SET NAMES utf8mb4둜 λ¬Έμžμ…‹ 동기화 처리λ₯Ό 톡해 ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.
      βœ… 문제 ν•΄κ²° μ™„λ£Œ

🧩 MySQL νŒŒν‹°μ…”λ‹ 방식 μ‹€ν—˜

βš™οΈ 1μ°¨ μ‹œλ„: LIST - RANGE

  • λͺ©ν‘œ
    성별 κΈ°μ€€μœΌλ‘œ 리슀트 λΆ„ν•  ν›„, μ—°μ²΄μ›κΈˆ_졜근 κΈ°μ€€ λ²”μœ„λ‘œ μ„œλΈŒ νŒŒν‹°μ…”λ‹μ„ λͺ©ν‘œλ‘œ μ§„ν–‰ν•΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

  • μ‹œλ„ν•œ μ½”λ“œ

    CREATE TABLE temp_data (
        λ°œκΈ‰νšŒμ›λ²ˆν˜Έ VARCHAR(20),
        성별 CHAR(1),
        μ—°μ²΄μ›κΈˆ_졜근 INT
    )
    PARTITION BY LIST (성별)
    SUBPARTITION BY RANGE (μ—°μ²΄μ›κΈˆ_졜근)
    (
        PARTITION p_male VALUES IN ('M')
            SUBPARTITIONS 3 (
                SUBPARTITION sp_male_low VALUES LESS THAN (100000),
                SUBPARTITION sp_male_mid VALUES LESS THAN (500000),
                SUBPARTITION sp_male_high VALUES LESS THAN MAXVALUE
            ),
        PARTITION p_female VALUES IN ('F')
            SUBPARTITIONS 3 (
                SUBPARTITION sp_female_low VALUES LESS THAN (100000),
                SUBPARTITION sp_female_mid VALUES LESS THAN (500000),
                SUBPARTITION sp_female_high VALUES LESS THAN MAXVALUE
            )
    );
    
  • κ²°κ³Ό
    ❌ MySQLμ—μ„œ LIST + RANGE 쑰합은 직접적인 μ„œλΈŒ νŒŒν‹°μ…”λ‹μœΌλ‘œ μ§€μ›λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

βš™οΈ 2μ°¨ μ‹œλ„: RANGE β†’ HASH β†’ LIST μ‘°ν•©μ˜ 3μ°¨ νŒŒν‹°μ…”λ‹

  • λͺ©ν‘œ
    닀차원 κΈ°μ€€ (μ—°μ²΄μΌμž, 정보아이디, κΈˆμ•‘)을 λͺ¨λ‘ λ°˜μ˜ν•˜κΈ° μœ„ν•΄
    RANGE β†’ HASH β†’ LIST ꡬ쑰의 3단계 νŒŒν‹°μ…”λ‹ μ‹œλ„ν•΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

  • κ²°κ³Ό
    ❌ μ„œλΈŒ νŒŒν‹°μ…”λ‹μœΌλ‘œ 3μ°¨λŠ” MySQLμ—μ„œ ν—ˆμš©λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

πŸ“’ κ²°λ‘ 
MYSQL κΈ°μ€€ 2단계 νŒŒν‹°μ…”λ‹κΉŒμ§€ μ§€μ›ν•˜λ©°, 메인 νŒŒν‹°μ…”λ‹μ€ RANGE와 LIST μ„œλΈŒ νŒŒν‹°μ…”λ‹μ€ HASH와 KEY μ‚¬μš© κ°€λŠ₯ν•˜λ‹€λŠ”κ±Έ μ•Œκ²Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.


βš™οΈ νŒŒν‹°μ…˜ ν‚€λ‘œ 쑰회 μ‹œ νƒμƒ‰ν•˜λŠ” row의 μˆ˜κ°€ 1μ΄λ˜λŠ” ν˜„μƒ

  • 이슈
explain analyze select * from range_hash
where 연체연도=2000 and λ°œκΈ‰νšŒμ›λ²ˆν˜Έ=9945;

PK νŠΈλŸ¬λΈ” μŠˆνŒ…(μ „)
row의 μˆ˜κ°€ μ„œλΈŒνŒŒν‹°μ…˜μ˜ row(μ•½ 4000개)둜 좜λ ₯λ˜μ§€ μ•ŠλŠ” 이슈 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

  • ν•΄κ²° 방법
explain analyze select * from range_hash
IGNORE INDEX (PRIMARY)
where 연체연도=2000 and λ°œκΈ‰νšŒμ›λ²ˆν˜Έ=9945;

PK νŠΈλŸ¬λΈ” μŠˆνŒ…(ν›„)

νŒŒν‹°μ…”λ‹ κΈ°λ²•λ§ŒμœΌλ‘œ μ„±λŠ₯ 비ꡐλ₯Ό μœ„ν•΄ PK 인덱슀 탐색을 λ°°μ œν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.


πŸ” ν–₯ν›„ λ°œμ „λ°©ν–₯

1. λ°©λŒ€ν•œ 데이터양과 νŒŒν‹°μ…˜ κ°œμˆ˜μ— λ”°λ₯Έ νŒŒν‹°μ…”λ‹ μ„±λŠ₯ 비ꡐ

2. μ μ ˆν•œ νŒŒν‹°μ…”λ‹ κΈ°λ²•μœΌλ‘œ 연체 μœ„ν—˜λ„ 뢄석 μ‹€μ‹œ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •