MySQL 인덱스 퀴즈 - 세트 D
총 7개 문제로 구성된 MySQL 인덱스 학습 퀴즈입니다.
문제 1. 다음과 같은 테이블 tbl과 DATE 자료형의 컬럼인 date_column에 대한 인덱스 tbl_idx가 있다.
```sql
CREATE TABLE tbl (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
date_column DATE
);
CREATE INDEX tbl_idx ON tbl (date_column);
```
다음 쿼리는 인덱스 tbl_idx를 활용할까?
```sql
SELECT * FROM tbl WHERE EXTRACT(YEAR FROM date_column) = 2024;
```
문제 2. 다음 employees 테이블과 복합 컬럼 (gender, birth_date)로 생성한 복합 인덱스 idx_gender_birthdate가 있다고 가정하자
```sql
CREATE TABLE employees (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no),
INDEX idx_gender_birthdate (gender, birth_date)
);
```
다음 쿼리는 idx_gender_birth_date 인덱스를 활용하는가?
```sql
SELECT * FROM employees WHERE gender = 'M' AND birth_date > '1965-02-01';
```
문제 3. 다음 employees 테이블과 복합 컬럼 (gender, birth_date)로 생성한 복합 인덱스 idx_gender_birthdate가 있다고 가정하자
```sql
CREATE TABLE employees (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no),
INDEX idx_gender_birth_date (gender, birth_date)
);
```
다음 쿼리는 idx_gender_birth_date 인덱스를 활용하는가?
```sql
SELECT * FROM employees WHERE gender = 'M' OR birth_date > '1965-02-01';
```
문제 4. 다음과 같은 employees 테이블과 first_name컬럼을 대상으로 한 idx_firstname 인덱스가 존재한다.
```sql
CREATE TABLE employees (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no),
INDEX idx_firstname (first_name)
);
```
다음 쿼리는 idx_firstname을 활용하는가?
```sql
SELECT * FROM employees emp WHERE emp.first_name IN ('Georgi', 'Parto');
```
문제 5. 다음과 같은 employees 테이블과 first_name컬럼을 대상으로 한 idx_firstname 인덱스가 존재한다.
```sql
CREATE TABLE employees (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no),
INDEX idx_firstname (first_name)
);
```
다음 쿼리는 idx_firstname을 활용하는가?
```sql
SELECT * FROM employees emp WHERE emp.first_name NOT IN ('Georgi', 'Parto');
```
문제 6. 다음 테이블과 인덱스가 있다.
```sql
CREATE TABLE test_case (
col1 BIGINT PRIMARY KEY,
col2 VARCHAR(100),
col3 INT
) ENGINE=InnoDB;
CREATE INDEX idx_col2 ON test_case(col2);
```
아래 쿼리의 실행 방식에 대한 설명으로 올바른 것은?
```sql
SELECT *
FROM test_case
WHERE col2 = 'ABC';
```
- idx_col2의 리프 노드에서 col1와 col2를 찾을 수 있으므로, col3 값을 가져오기 위해 클러스터링 인덱스를 한 번 더 조회해야 한다.
- idx_col2의 리프 노드에서 col2를 찾을 수 있으므로, col1과 col3 값을 가져오기 위해 클러스터링 인덱스를 한 번 더 조회해야 한다.
- idx_col2의 리프 노드에 col1, col2, col3가 모두 저장되어 있으므로 세컨더리 인덱스 테이블 접근만으로 바로 결과를 반환할 수 있다.
- 세컨더리 인덱스를 사용할 수 없으며, 클러스터링 인덱스만을 이용해 탐색한다.
문제 7. 다음 테이블과 인덱스가 있다.
```sql
CREATE TABLE test_case (
col1 BIGINT PRIMARY KEY,
col2 VARCHAR(100),
col3 INT
) ENGINE=InnoDB;
CREATE INDEX idx_col2 ON test_case(col2);
```
아래 쿼리의 실행 방식에 대한 설명으로 올바른 것은?
```sql
SELECT col1
FROM test_case
WHERE col2 = 'ABC';
```
- idx_col2의 리프 노드에 col1와 col2가 모두 저장되어 있으므로 인덱스 테이블만 활용하여 바로 결과를 반환할 수 있다.
- idx_col2의 리프 노드에서 col1와 col2를 찾을 수 있으므로, col3 값을 가져오기 위해 클러스터링 인덱스를 한 번 더 조회해야 한다.
- idx_col2의 리프 노드에 col2 값이 저장되어 있으므로, col1 값을 가져오기 위해 클러스터링 인덱스를 한 번 조회한다.
- 세컨더리 인덱스를 사용할 수 없으며, 항상 클러스터링 인덱스를 이용해 탐색한다.
다른 퀴즈 세트 보기