마트철수
[049] MySQL: 인덱스 (+ScoularTodo 제작) 본문
2024.07.17(수)
MySQL 6일차
인덱스의 대한 전체적인 내용 정리하고,
ScoulaTodo 제작에 필요한 몇 코드를 적어놨다.
이것이 MySQL이다
PART01 MySQL 설치 및 DB 구축과정 미리 실습하기
- CH01 DBMS 개요와 MySQL 소개
- CH02 MySQL 설치
- CH03 MySQL 전체 운영 실습
PART02 MySQL 기본
- CH04 데이터베이스 모델링
- CH05 MySQL 유틸리티 사용법
- CH06 SQL 기본
- CH07 SQL 고급
PART03 MySQL 고급
- CH08 테이블과 뷰
- CH09 인덱스
- CH10 스토어드 프로그램
- CH11 전체 텍스트 검색과 파티션
CH09 인덱스
인덱스의 개념
인덱스의 장점과 단점
- 장점: 검색 속도 향상.
- 단점: 추가적인 공간 필요, 인덱스 생성 시 많은 시간 소요 (정렬 시간).
- Tradeoff 관계: 속도와 메모리 양은 서로 반비례 관계 (둘 다 좋을 수 없음).
인덱스의 종류와 자동 생성
- 클러스터형 인덱스 (Clustered Index)
- 특징: 행 데이터를 자신의 열(PK)을 기준으로 정렬.
- 제한: 테이블당 하나만 생성 가능 (테이블 당 행의 집합은 하나이기 때문).
- 보조 인덱스 (Secondary Index)
- 특징: 별도의 공간을 추가하여 지정한 컬럼만 정렬.
- 제한: 컬럼 단위로 여러 개의 인덱스 생성 가능 (추가 메모리 사용).
- 주의: LIKE 'c%'와 같은 패턴 매칭에는 인덱스 사용 불가.
자동 생성 인덱스
- Primary Key 제약 조건: 클러스터형 인덱스 자동 생성.
- Unique 제약 조건: 보조 인덱스 자동 생성.
- Primary Key 없고, Unique 및 Not Null 제약 조건: 클러스터형 인덱스 자동 생성.
인덱스의 내부 작동
B-Tree (Balanced Tree, 균형 트리)
- 페이지 (Page): B-Tree의 노드. 16Kbyte의 고정 크기로 데이터를 저장.
- 페이지 분할: 페이지에 공간이 없을 경우 새로운 페이지를 생성.
인덱스의 생성, 변경, 삭제
- 인덱스 생성 명령어

- 인덱스 삭제 명령어
DROP INDEX idx_usertbl_addr ON usertbl;
테이블 분석 및 처리
- 테이블 분석
ANALYZE TABLE usertbl;
- 테이블 상태 확인
SHOW TABLE STATUS LIKE 'usertbl';
예제와 실습
클러스터형 인덱스 생성 예제
CREATE TABLE usertbl ( userID INT PRIMARY KEY, name VARCHAR(100), birthYear INT );
보조 인덱스 생성 예제
CREATE INDEX idx_usertbl_birthYear ON usertbl(birthYear);
보조 인덱스 삭제 예제
DROP INDEX idx_usertbl_birthYear ON usertbl;
정렬 작업
정렬이 발생하는 경우
- I/U/D 작업: Insert, Update, Delete 작업 시 정렬 필요.
- 정렬 알고리즘: 배열에서 정렬은 'Quick 정렬', 검색은 'Binary 검색' 사용.
ScoulaTodo
...
TodoService 작성
- 각각의 기능을 구현 후 메뉴에 추가
- 로그인 사용자 정보는 컨텍스트를 통해 획득 (Contextget)
표현이 너무 많다면? 람다식 사용
Supplier 인터페이스 활용
이전 내용 복습
1. Runnable 인터페이스:
( ) -> void / 매개변수가 없고, 반환 타입이 void인 run 메서드 정의
2. Predicate 인터페이스:
(T t) -> boolean / 주어진 인자를 테스트하여 boolean 값으로 반환하는 test 메서드 정의
- 스트림의 filter 메서드는 Predicate를 인수로 받아서, 스트림의 각 요소를 검사
- true를 반환하는 요소만으로 구성된 새 스트림 반환
- 대표적으로 사용되는 함수형 인터페이스 (★)
하나의 추상 메서드는 가지는 인터페이스

- 예외는 언제 발생?
길이 제한을 넘어설 때

실습: 인덱스
- 스스로 작성하지 못한 코드
-- ALTER를 사용하여 usertbl에서 PRIMARY KEY 제약조건을 제거하고, name 컬럼에 pk_name이라는 제약조건명으로 기본키를 설정하세요.
ALTER TABLE usertbl DROP primary key;
ALTER TABLE usertbl
ADD constraint pk_name primary key(name);
SELECT * FROM usertbl;
- 데이터, 인덱스 크기 확인
-- usertbl의 데이터 크기와 인덱스의 크기 확인
SHOW TABLE STATUS LIKE 'usertbl';

- 컬럼 조합으로 인덱스 생성
-- name, birthYear 조합으로 인덱스 생성
-- 컬럼 조합시 ','로 이어서 넣어준다
-- 여러 개의 컬럼으로 인덱스를 만들 경우 각 컬럼당 한 행이 추가된다.
CREATE UNIQUE INDEX idx_usertbl_name_birthYear
ON usertbl(name, birthYear);

Dao 코드 학습 기록
모듈 시험 대비 코드 주석 추가
UserDao 인터페이스 구축
public interface UserDao {
// 회원 등록
// 매개변수: UserVO 객체 (사용자의 정보가 담긴 객체)
// 반환값: 회원 등록의 성공 여부를 나타내는 int 값 (일반적으로 1은 성공, 0은 실패를 나타냄)
// 예외: SQL 처리 중 발생할 수 있는 SQLException을 던짐
int create(UserVO user) throws SQLException;
// 회원 목록 조회
// 매개변수: 없음
// 반환값: UserVO 객체들의 리스트 (모든 회원의 정보를 담고 있음)
// 예외: SQL 처리 중 발생할 수 있는 SQLException을 던짐
List<UserVO> getList() throws SQLException;
// 회원 정보 조회
// 매개변수: String id (조회하려는 회원의 ID)
// 반환값: Optional<UserVO> 객체 (ID에 해당하는 회원의 정보가 담긴 객체, 회원이 없을 경우 비어 있을 수 있음)
// 예외: SQL 처리 중 발생할 수 있는 SQLException을 던짐
Optional<UserVO> get(String id) throws SQLException;
// 회원 수정
// 매개변수: UserVO 객체 (수정할 회원의 정보가 담긴 객체)
// 반환값: 회원 수정의 성공 여부를 나타내는 int 값 (일반적으로 1은 성공, 0은 실패를 나타냄)
// 예외: SQL 처리 중 발생할 수 있는 SQLException을 던짐
int update(UserVO user) throws SQLException;
// 회원 삭제
// 매개변수: String id (삭제하려는 회원의 ID)
// 반환값: 회원 삭제의 성공 여부를 나타내는 int 값 (일반적으로 1은 성공, 0은 실패를 나타냄)
// 예외: SQL 처리 중 발생할 수 있는 SQLException을 던짐
int delete(String id) throws SQLException;
}
'KB IT's Your Life > 교육' 카테고리의 다른 글
| [051] BFS, DFS (알고리즘 핵심) (0) | 2024.07.19 |
|---|---|
| [050] 페이지네이션 + TodoApp 구현하기 (0) | 2024.07.18 |
| [048] 뷰&정규화 과정 (+JDBC 프로그래밍 중요코드) (1) | 2024.07.16 |
| [047] 트랜잭션, JDBC 프로그래밍 (0) | 2024.07.15 |
| [046] 프로그래머스: 재귀와 완전탐색 (0) | 2024.07.12 |