MySQL 인덱스 퀴즈 - 세트 E
총 7개 문제로 구성된 MySQL 인덱스 학습 퀴즈입니다.
문제 1. 다음 중 기본키에 대한 설명으로 옳은 것을 **하나** 고르시오.
- PK는 nullable 하게 선언 가능하다.
- PK는 BIGINT 타입으로만 선언 가능하다.
- PK는 짧게 설정할 것을 권장한다.
- PK가 선언되지 않고 NOT NULL UNIQUE 키만 선언되었다면, 내부적으로 row num을 생성하여 클러스터링 인덱스 키로 사용한다.
문제 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 my_table (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
a INT,
b INT,
date_column DATE,
INDEX idx_a_date (a, date_column)
);
```
먼저 해당 쿼리를 실행했다고 가정한다.
```sql
EXPLAIN SELECT date_column, COUNT(*)
FROM my_table
WHERE a = 1
GROUP BY date_column;
```
위의 쿼리에 `b=1` 조건을 추가하여 실행할 때 위의 쿼리와의 실행속도를 비교하시오.
```sql
EXPLAIN SELECT date_column, COUNT(*)
FROM my_table
WHERE a = 1
AND b = 1
GROUP BY date_column;
```
- Same: 쿼리 성능이 거의 동일하다
- Not enough information: 확실한 답변을 내리기엔 정보가 부족하다
- Slower: 쿼리 수행 시간이 더 오래 걸린다
- Faster: 쿼리 수행 시간이 더 짧아진다
문제 4. 다음 dept_empt 테이블이 있다
```sql
CREATE TABLE dept_emp (
emp_no int NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (`dept_no`,`emp_no`),
);
```
다음 쿼리에 대한 인덱스 스캔에 대한 설명 중 옳은 것은?
```sql
SELECT dept_no, MIN(emp_no)
FROM dept_emp as emp
WHERE emp.dept_no BETWEEN 'd002' AND 'd004'
GROUP BY emp.dept_no;
```
- dept_no가 'd002'와 'd004' 범위 안에서 인덱스를 듬성듬성 스캔한다 - 루스 인덱스 스캔
- dept_no가 'd002'와 'd004' 범위 안인 인덱스를 모두 스캔한다 - 인덱스 레인지 스캔
- (dept_no, emp_no) 인덱스를 모두 스캔한다 - 인덱스 풀 스캔
문제 5. 다음의 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 co1, SUM(col2) FROM t1 GROUP BY col1;
```
문제 6. 다음의 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;
```
문제 7. 다음 broccoli 테이블이 있다.
```sql
CREATE TABLE broccoli (
id INT PRIMARY KEY AUTO_INCREMENT,
num INT,
name VARCHAR(100),
color VARCHAR(50),
INDEX idx_name_color (name(5), color) #name의 앞 5글자를 따온 부분 인덱스
);
```
다음 쿼리는 인덱스 루스 스캔을 활용 가능한가?
```sql
SELECT name, MIN(color) FROM broccoli GROUP BY name;
```
다른 퀴즈 세트 보기