인프런 커뮤니티 질문&답변

리나님의 프로필 이미지
리나

작성한 질문수

MySQL 성능 최적화

[실습] Optimize Index Dive using FORCE INDEX

performance_schema.events_stages_history_long, performance_schema.events_statements_history_long 테이블에 데이터가 쌓이지 않고 있습니다.

작성

·

9

0

안녕하세요 우선 좋은 강의 남겨주셔서 감사합니다.

 

인덱스 다이브 최적화 영상을 보고 따라 해보았는데요.

 

SHOW VARIABLES LIKE 'performance_schema';

`performance_schema` 퍼포먼스 스키마 조회를 하게된다면

질문1.png.webp

 

이렇게 ON 으로 되어 있습니다.

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'statement/%';
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'stage/%';
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_stages%';
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_statements%%';

퍼포먼스 스키마에 필요한 지표들을 수집 하도록 하고 테이블에 저장 할 수 있도록 해당 쿼리문을 실행 했습니다.

 

이에 대한 해당 테이블 조회 값 입니다. (performance_schema.setup_instruments 테이블은 너무 많아 생략하고 performance_schema.setup_consumers 만 보여드립니다.)

 

질문2.png.webp

 

그리고 해당 orders 테이블을 조회 하고 나서

SELECT stages.EVENT_ID, statements.EVENT_ID, statements.END_EVENT_ID, statements.SQL_TEXT, stages.EVENT_NAME, stages.TIMER_WAIT / 100
FROM performance_schema.events_stages_history_long AS stages
JOIN performance_schema.events_statements_history_long AS statements
ON (stages.EVENT_ID >= statements.EVENT_ID AND stages.EVENT_ID <= statements.END_EVENT_ID)
WHERE stages.EVENT_NAME LIKE '%statistics%'
AND statements.SQL_TEXT LIKE '%FROM orders%'
AND statements.SQL_TEXT NOT LIKE '%SELECT stages.EVENT_ID,%'
ORDER BY statements.EVENT_ID DESC;

 

performance_schema 를 통해 성능 비교 했는데요.

 

아무것도 나오지가 않습니다.

 

실제로

  1. performance_schema.events_stages_history_long

  2. performance_schema.events_statements_history_long

이 테이블이 아무것도 쌓이지 않는다는 것을 확인하였습니다.

 

왜 이런 현상이 나타나는걸까요?

 

참고로 버전은 MySQL (ver. 9.1.0) 이고 docker 를 이용해 서버를 구동했었습니다.

 

 

 

 

 

 

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

리나님, 질문 주신 내용에 대해 살펴보겠습니다. MySQL의 performance_schema는 데이터베이스의 성능 및 상태 정보를 모니터링하고 진단하는 데 유용한 스키마입니다. 여기서 events_stages_history_longevents_statements_history_long와 같은 테이블은 쿼리의 이벤트와 단계 정보를 기록하는 역할을 합니다.

하지만 리나님이 언급하신 문제처럼 해당 테이블에 데이터가 쌓이지 않는 경우가 발생할 수 있습니다. 이는 몇 가지 원인에 의해 발생할 수 있습니다:

  1. 수집 설정 문제: setup_instrumentssetup_consumers 테이블에서 특정했던 설정이 올바르게 적용되지 않았을 수 있습니다. 업데이트 쿼리를 실행한 후에는 MySQL 인스턴스를 재시작하여 변경 사항이 제대로 반영되었는지 확인해 주세요.

  2. MySQL 버전 및 설정: 말씀하신 MySQL 버전 9.1.0은 실제로 존재하지 않는 버전입니다. MySQL은 현재 8.x 버전이 최신이며, MariaDB나 다른 포크 버전일 가능성이 있으므로 정확한 버전을 확인해야 합니다. 또한 Docker 컨테이너 내부 설정이 바깥에서 변경되지 못할 수 있으니, 컨테이너 내부 설정을 직접 확인해 보세요.

  3. 쿼리 실행 시점: 데이터 수집은 설정 변경 이후에 실행된 쿼리에 대해서만 기록됩니다. 설정을 변경한 후에 조회를 실행해야 관련 데이터가 저장됩니다.

  4. 버그 또는 미지원 기능: 사용 중인 데이터베이스 버전이 성능 스키마의 특정 기능을 지원하지 않거나 버그로 인해 동작하지 않을 수 있습니다. 최신 패치와 업데이트를 확인해 주세요.

아래의 링크를 참고하여 performance_schema에 설정된 내용을 다시 한 번 확인하여 보세요:

이 내용이 문제 해결에 도움이 되었으면 합니다. 성능 스키마 설정을 조정해 보고, 데이터베이스 로그를 통해 더 많은 정보를 수집할 수 있습니다. 궁금한 점이 더 있으시면 질문해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

리나님의 프로필 이미지
리나

작성한 질문수

질문하기