MySQL 인덱스 퀴즈 - 세트 BEST_DIFFICULT
총 7개 문제로 구성된 MySQL 인덱스 학습 퀴즈입니다.
문제 1. employee 테이블에 생성되는 인덱스의 개수는 몇 개인가?
```sql
CREATE TABLE department (
dept_id INT PRIMARY KEY
);
CREATE TABLE employee (
emp_id INT PRIMARY KEY,
email VARCHAR(255) UNIQUE,
dept_id INT,
hire_date DATE,
CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES department(dept_id)
);
```
문제 2. 다음과 같은 employees 테이블이 있다.
```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),
);
```
employees 테이블에는 다음 2가지 인덱스가 존재한다.
```sql
CREATE INDEX idx_date_name_gender_pk ON employees(birth_date, first_name, gender, emp_no);
CREATE INDEX idx_name_gender_pk ON employees(first_name, gender, emp_no);
```
다음 쿼리는 어떤 인덱스를 활용하는가?
```sql
SELECT *
FROM employees
WHERE birth_date BETWEEN '1953-05-30' AND '1954-05-31'
AND first_name = 'Ebbe'
AND gender = 'F'
GROUP BY emp_no;
```
- idx_date_name_gender_pk
- idx_name_gender_pk
문제 3. 다음 테이블과 인덱스가 있다.
```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가 모두 저장되어 있으므로 세컨더리 인덱스 테이블 접근만으로 바로 결과를 반환할 수 있다.
- 세컨더리 인덱스를 사용할 수 없으며, 클러스터링 인덱스만을 이용해 탐색한다.
문제 4. 다음의 test_table 이 있다.
```sql
CREATE TABLE test_table (
id INT PRIMARY KEY AUTO_INCREMENT,
col1 INT,
col2 INT,
col3 INT,
col4 INT,
INDEX idx_col1_col2_col3 (col1, col2, col3)
);
```
다음 쿼리는 인덱스 루스 스캔을 활용 가능한가?
```sql
SELECT col1, AVG(DISTINCT col2) FROM tb_test GROUP BY col1;
```
문제 5. 복합 컬럼 col1, col2를 대상으로 유니크 인덱스 조건이 걸린 test_table이 있다.
```sql
CREATE TABLE test_table (
id INT AUTO_INCREMENT PRIMARY KEY,
col1 VARCHAR(50),
col2 VARCHAR(50),
UNIQUE KEY uniq_col1_col2 (col1, col2)
);
```
다음 쿼리를 실행할 때 예상되는 결과를 고르시오
```sql
INSERT INTO test_table (col1, col2) VALUES ('A', NULL);
INSERT INTO test_table (col1, col2) VALUES ('A', NULL);
```
- 두 삽입 쿼리 모두 성공한다
- 첫번째 삽입 쿼리는 성공하고 두번째 삽입 쿼리는 실패한다
- 두 삽입 쿼리 모두 실패한다
문제 6. 기본키를 AUTO_INCREMENT, UUID로 하는 각각 두 가지 테이블이 있다
```sql
CREATE TABLE t_ai (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
num INT NOT NULL,
payload CHAR(100) NOT NULL
) ENGINE=InnoDB;
CREATE TABLE t_uuid (
id BINARY(16) PRIMARY KEY,
num INT NOT NULL,
payload CHAR(100) NOT NULL
) ENGINE=InnoDB;
```
각 테이블에 1000만건의 데이터를 삽입했다. 이때 num은 rowID와 같이 1부터 순차적으로 증가한다.
가령 테이블에 다음과 같이 저장되어 있다
```text
//ai_table
+---------------------+------+-----------+
|id(AUTO_INCREMENT) |num |payload |
+---------------------+------+-----------+
|1 |1 |payload1 |
|2 |2 |payload2 |
|3 |3 |payload3 |
+---------------------+------+-----------+
//uuid_table
+-----------------------------------------+------+-----------+
|id(UUID) |num |payload |
+-----------------------------------------+------+-----------+
|2e8ac55d-e91f-11f0-a300-0242ac110002 |1 |payload1 |
|2e8ad1eb-e91f-11f0-a300-0242ac110002 |2 |payload2 |
|2e8ae07e-e91f-11f0-a300-0242ac110002 |3 |payload3 |
+-----------------------------------------+------+-----------+
```
이때 다음 삭제 쿼리를 실행시켰다.
```sql
DELETE FROM {테이블 명} WHERE num < 500000;
```
해당 쿼리는 PK와 num의 범위 순차성이 보장된 t_ai의 경우 데이터를 페이지 순차적으로 삭제하는 쿼리가 되고, 실제 데이터를 정렬하는 PK와 num의 정렬이 일치하지 않는 t_uuid에게는 데이터 랜덤 삭제를 시도하는 쿼리가 된다.
이때 두 테이블의 Index Page Merge의 횟수를 비교하시오
- AUTO_INCREMENT 기본키로 하는 테이블의 인덱스 페이지 머지 시도 횟수가 더 많다.
- UUID를 기본키로 하는 테이블의 인덱스 페이지 머지 시도 횟수가 더 많다.
문제 7. 다음 함수 기반 인덱스가 선언된 테이블이 있다.
```sql
CREATE TABLE human (
user_id BIGINT PRIMARY KEY,
first_name VARCHAR(10),
last_name VARCHAR(10),
INDEX ix_fullname ((CONCAT(first_name, '', last_name))) #함수 기반 인덱스
);
```
각 쿼리의 ix_fullname 인덱스 활용여부를 고르시오.
```text
1번 쿼리 : SELECT * FROM human WHERE CONCAT(first_name, ' ', last_name) = 'john smith';
2번 쿼리 : SELECT * FROM human WHERE CONCAT(first_name, '', last_name) LIKE 'john%';
```
- 1번 쿼리 : O | 2번 쿼리: O
- 1번 쿼리 : X | 2번 쿼리: O
- 1번 쿼리 : O | 2번 쿼리: X
- 1번 쿼리 : X | 2번 쿼리: X
다른 퀴즈 세트 보기