10장 실행계획

2024. 7. 1. 19:26BOOKS/Real MySQL 8.0

문제 1. MySQL 8.0부터 인덱스되지 않은 칼럼들에 대해서도 데이터 분포도를 수집해서 저장하는데 이 정보를 무엇이라고 합니까?

히스토그램

문제 2. 일부 파티션만 접근해서 읽었을 때, 실행 계획에서 type이 ALL이라고 뜨는 이유는 무엇인가요

파티션은 물리적으로 개별 테이블처럼 별도의 저장 공간을 가지기 때문에 해당 파티션을 풀 스캔할 경우 type이 ALL로 나옵니다.

문제 3. 실행 계획에서 rows 칼럼이 나타낸 것은 무엇인가요?

실행 계획의 효율성 판단을 위해 예측했던 레코드 건수
쿼리를 처리하기 위해 얼마나 많은 레코드를 읽고 처리해야 하는지를 의미함

문제 4. 이 쿼리는 salary 칼럼으로 만들어진 인덱스를 사용할 수 없습니다. 그 이유와 인덱스를 사용할 수 있도록 튜닝한 쿼리를 알려주세요.

select * from salaries where salary*10 > 150000;
salary 칼럼을 가공 후 비교를 수행하고 있기 때문에 인덱스를 사용할 수 없다.
select * from salaries where salary > 150000/10;

문제 5. emp_no가 문자열로 저장되어 있을 경우 다음과 쿼리를 작성하면 인덱스를 사용할 수 없습니다. 그 이유를 알려주세요.

SELECT * FROM employees WHERE emp_no=10001;
문자열 타입과 숫자 타입을 비교하면 숫자 타입의 우선순위가 더 높아 문자열을 숫자로 변환 후 비교를 수행합니다. emp_no의 타입이 바뀌면서 인덱스에 저장된 emp_no의 타입과 달라 인덱스를 사용할 수 없게됩니다.

문제 6. 파티션 내에서 현재 레코드를 기준으로 n번째 이전 레코드를 반환하는 함수는 무엇인가요?

LAG()

문제 7. =과 <=>의 차이점은?

<=>은 null-safe 연산자로 null에 대한 비교까지 수행합니다.

문제 8. LOAD DATA를 쓸 때 데이터 파일을 여러개로 나눠서 실행하는 것이 좋은 이유는?

LAOD DATA는 단일 스레드로 실행되기 때문에 데이터가 크면 실행 시간이 길어져 다른 쿼리 성능에 영향을 줄 수 있고, 하나의 트랜잭션으로 처리되기 때문에 언두로그가 삭제되지 못하고 계속 쌓여 언두로그를 디스크에 쓰는 부하와, 레코드를 읽는 쿼리들이 필요한 레코드를 찾는데 많은 오버헤드를 발생시킨다. 따라서 데이터 파일을 나눠서 LOAD DATA를 여러 트랜잭션으로 나누어 실행하는 것이 좋다.

문제 9. employees테이블에서 last_name으로 정렬해서 상위 10건의 데이터만 삭제하는 쿼리를 작성해주세요.

DELETE FROM employees ORDER BY last\_name LIMIT 10;

문제 10. 제너럴 테이블스페이스의 장점은?

제너럴 테이블스페이스를 사용하면 파일 핸들러를 최소화
테이블스페이스 관리에 필요한 메모리 공간 최소화

문제 11. 쿼리의 성능에 영향을 미치는 요소 4가지를 말씀해주세요

  • 운영체제의 캐시
  • MySQL 서버의 버퍼 풀
  • 독립된 MySQL 서버
  • 쿼리 테스트 횟수

'BOOKS > Real MySQL 8.0' 카테고리의 다른 글

14장 스토어드 프로그램  (0) 2024.07.01
13장 파티션  (0) 2024.07.01
9장 옵티마이저와 힌트  (0) 2024.07.01
8장 인덱스  (0) 2024.07.01
5장 트랜잭션  (0) 2024.07.01