MySQL 인덱스 퀴즈 - 세트 A
총 7개 문제로 구성된 MySQL 인덱스 학습 퀴즈입니다.
문제 1. 다음과 같이 인덱스가 없는 `no_index_table`와 인덱스가 설정된 `index_table`가 있습니다.
```sql
CREATE TABLE no_index_table (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
age INT,
city VARCHAR(255)
);
CREATE TABLE index_table (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
age INT,
city VARCHAR(255),
INDEX idx_name (name),
INDEX idx_age_city (age, city)
);
```
다음 두 쿼리를 실행했을 때 각각 **어느 테이블에서 더 빠른 성능을 보이는지** 고르세요.
```sql
-- A쿼리: 10만 건의 더미 데이터를 삽입
INSERT INTO 테이블 (name, age, city)
SELECT
CONCAT('NewName', FLOOR(RAND() * 1000000)),
FLOOR(RAND() * 100),
CONCAT('NewCity', FLOOR(RAND() * 1000))
FROM
(SELECT 1 FROM information_schema.tables LIMIT 100000) a;
-- B쿼리: 특정 name 값 검색
SELECT * FROM 테이블 WHERE name = 'Name12345';
```
- A(insert) : no_index_table - B(select) : no_index_table
- A(insert) : no_index_table - B(select) : index_table
- A(insert) : index_table - B(select) : no_index_table
- A(insert) : index_table - B(select) : index_table
문제 2. 다음과 같이 **InnoDB 스토리지 엔진**을 사용하여 **B-Tree 인덱스**를 사용하는 `btree_table`와 **Memory 스토리지 엔진**을 사용하여 **Hash 인덱스**를 사용하는 `hash_table`이 있다.
```sql
-- B-Tree 인덱스를 사용하는 InnoDB 테이블
CREATE TABLE btree_table (
id INT PRIMARY KEY,
value INT,
INDEX idx_value (value)
) ENGINE=InnoDB;
-- Hash 인덱스를 사용하는 Memory 테이블
CREATE TABLE hash_table (
id INT PRIMARY KEY,
value INT,
INDEX idx_value (value)
) ENGINE=MEMORY;
```
---
다음 두 쿼리를 실행했을 때, **인덱스를 활용한 탐색 성능이 더 빠른 쪽**을 고르시오.
```sql
-- B-Tree에서 동등조건 탐색
SELECT * FROM btree_table WHERE value = 12345;
-- Hash에서 동등조건 탐색
SELECT * FROM hash_table WHERE value = 12345;
```
- B-Tree 인덱스를 사용하는 btree table의 인덱스 스캔이 더 빠르다
- Hash 인덱스를 사용하는 hash table의 인덱스 스캔이 더 빠르다
- 두 인덱스 스캔 속도는 비슷하다
문제 3. 다음과 같이 **InnoDB 스토리지 엔진**을 사용하여 **B-Tree 인덱스**를 사용하는 `btree_table`와 **Memory 스토리지 엔진**을 사용하여 **Hash 인덱스**를 사용하는 `hash_table`이 있다.
```sql
-- B-Tree 인덱스를 사용하는 InnoDB 테이블
CREATE TABLE btree_table (
id INT PRIMARY KEY,
value INT,
INDEX idx_value (value)
) ENGINE=InnoDB;
-- Hash 인덱스를 사용하는 Memory 테이블
CREATE TABLE hash_table (
id INT PRIMARY KEY,
value INT,
INDEX idx_value (value)
) ENGINE=MEMORY;
```
다음 두 쿼리에 있어서 인덱스를 활용한 쿼리의 성능을 비교하시오
```sql
-- B-Tree에서 범위조건 탐색
SELECT * FROM btree_table WHERE value BETWEEN 1000 AND 2000;
-- Hash에서 범위조건 탐색
SELECT * FROM hash_table WHERE value BETWEEN 1000 AND 2000;
```
- B-Tree 인덱스를 사용하는 btree table의 인덱스 스캔이 더 빠르다
- Hash 인덱스를 사용하는 hash table의 인덱스 스캔이 더 빠르다
- 두 인덱스 스캔 속도는 비슷하다
문제 4. Memory 스토리지 엔진을 사용하여 Hash Index를 사용하는 hash_table이 있다.
```sql
-- Hash 인덱스를 사용하는 Memory 테이블
CREATE TABLE hash_table (
id INT PRIMARY KEY,
value INT,
INDEX idx_value (value)
) ENGINE=MEMORY;
```
다음 쿼리는 hash_table의 idx_value 인덱스를 활용하는가?
```sql
select * from hash_table order by value;
```
- 해쉬 인덱스인 idx_value를 활용한다.
- 해쉬 인덱스인 idx_value를 활용하지 않는다.
문제 5. InnoDB 테이블에서 클러스터링 인덱스가 설정되어 있는 경우,
**보조 인덱스**의 리프 노드에는 어떤 정보가 저장되는가?
- 해당 인덱스 컬럼 값과 실제 레코드 전체 데이터
- 해당 인덱스 컬럼 값과 NULL
- 해당 인덱스 컬럼 값과 클러스터링 인덱스의 키 값
- 해당 인덱스 컬럼 값만 저장되며, 나머지 데이터는 저장되지 않는다
문제 6. 다음 중 MySQL InnoDB 스토리지 엔진에서
**클러스터링 인덱스(≒ Primary Key)** 에 대한 설명으로 **올바른 것**은 무엇인가요?
- 클러스터링 인덱스는 인덱스만 저장하고 실제 데이터는 별도 공간에 저장된다.
- 클러스터링 인덱스는 보조 인덱스보다 느리기 때문에 잘 사용되지 않는다.
- 클러스터링 인덱스는 테이블당 여러 개 생성할 수 있다.
- 클러스터링 인덱스는 리프 노드에 실제 데이터 레코드를 저장한다.
문제 7. 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)
);
```
다른 퀴즈 세트 보기