Index Quiz

MySQL 인덱스에 대한 지식을 테스트하고 향상시켜보세요!

문제 1 / 7

질문이 여기에 표시됩니다...

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) ); ```

  • 1개
  • 2개
  • 3개
  • 4개

문제 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

다른 퀴즈 세트 보기