MySQL의 max_seeks_for_key 시스템 변수는 인덱스 스캔 또는 전체 테이블 스캔을 선택할지 여부를 선택할 때 Optimizer의 의사 결정 프로세스와 관련된 임계 값을 제어합니다. MAX_SEEKS_FOR_KEY 설정 너무 높으면 MySQL 데이터베이스에서 쿼리의 성능과 효율성에 영향을 줄 수있는 몇 가지 위험이 있습니다.
max_seeks_for_key는 인덱스 키를 기반으로 행을 찾을 때 최적화가 기대하는 최대 키 수를 나타냅니다. 기본적 으로이 값은 매우 높습니다 (64 비트 시스템에서는 일반적으로 18,446,744,073,709,551,615로 설정됩니다). 즉, 최적화는 인덱스의 비싼 키 조회가 얼마나 비싸다는 가정 할 때 최적화자가 제한하지 않는다는 것을 의미합니다.
max_seeks_for_key가 매우 높게 설정되면, 최적화는 인덱스 스캔보다 테이블 스캔을 선호하는 경향이 있습니다. 이것은 몇 가지 바람직하지 않은 결과를 초래할 수 있습니다.
1. 최적의 쿼리 계획 :
높은 max_seeks_for_key의 가장 중요한 위험은 쿼리 최적화기가보다 효율적인 인덱스 스캔 대신 전체 테이블 스캔을 선택할 수 있다는 것입니다. 전체 테이블 스캔 테이블의 각 행을 순차적으로 읽으므로 테이블이 크고 쿼리가 작은 하위 집합 만 필요하면 I/O 비용이 더 높아질 수 있습니다. 이로 인해 적절한 인덱스 스캔을 사용하는 것과 비교하여 쿼리 실행 시간이 느려집니다.
2. 리소스 사용 및 대기 시간 증가 :
전체 테이블 스캔은 종종 테이블의 모든 행을 검사해야하기 때문에 더 많은 CPU 및 디스크 I/O 리소스를 소비합니다. 이는 전체 시스템로드에 기여하고, 쿼리의 대기 시간을 높이고, 특히 높은 사용자 동시성 또는 매우 큰 데이터 세트에서 MySQL 서버의 처리량을 줄일 수 있습니다.
3. 큰 테이블의 성능 저하 :
전체 스캔은 전체 테이블을 읽을 필요가 있으므로 Max_Seeks_for_key 많은 행이 많은 큰 테이블에 대해 성능에 너무 높은 영향을 미칩니다. 이상적으로 인덱스를 활용 해야하는 쿼리는 긴 스캔 기간 대신 행을 신속하게 필터링하여 응용 프로그램 응답 성을 저하시키는 대신 행을 신속하게 필터링합니다.
4. 쿼리 전반에 걸친 일관되지 않은 동작 :
max_seeks_for_key는 전역으로 적용되므로 값이 증가하면 서버의 모든 쿼리에 영향을 미칩니다. 일부 쿼리는 전체 스캔의 혜택을 누릴 수 있지만 인덱스에 최적화 된 다른 많은 스캔은 더 나빠질 수 있습니다. 이로 인해 예측 불가능 성과 일관되지 않은 쿼리 성능이 제공되며 신중하고 지속적인 쿼리 별 실험 및 튜닝이 필요합니다.
5. 인덱스 카디널리티를 효과적으로 활용하지 못함 :
인덱스 카디널리티 (인덱스의 고유 한 값 추정치)는 MySQL Optimizer의 결정의 핵심입니다. max_seeks_for_key가 너무 높게 설정되어 있다면, 최적화는 높은 카디 릿 인덱스를 논리적으로 사용해야하는 경우에도 실제보다 더 비싼 키가 필요할 수 있다고 가정하여 인덱스 스캔을 벌금을냅니다. 결과적으로 인덱스 기반 최적화는 활용률이 낮거나 무시됩니다.
6. 오해의 소지가있는 최적화 통계 :
Optimizer는 인덱스 카디널리티 및 행 조회와 관련된 비용과 같은 통계에 따라 다릅니다. max_seeks_for_key가 지나치게 허용함으로써 실제 비용을 마스킹하면 Optimizer가 액세스 경로를 잘못 판단하여 Optimizer의 전체 비용 모델 정확도에 영향을 줄 수 있습니다.
7. 성능 문제 해결 문제 :
max_seeks_for_key는 인덱스 통계 및 쿼리 계획과 복잡한 방식으로 상호 작용할 수 있으므로 너무 높게 설정하면 느린 쿼리 진단이 더 어려워 질 수 있습니다. 최적화의 기본 비용 가정이 왜곡되어 있기 때문에 튜닝 인덱스 또는 다시 쓰기 쿼리가 예상 개선을 일으키지 않는 상황으로 이어질 수 있습니다.
위험 요약 : max_seeks_for_key 너무 높은 설정 MySQL Optimizer는 인덱스 스캔 대신 전체 테이블 스캔을 선호하여 실행 시간이 느려지고, CPU 및 I/O 부하 증가, 인덱스의 비효율적 인 사용, 불일치 한 쿼리 동작, 최적화에 의한 비용 추정 및 과제에 의존하는 비용 추정을 유발합니다.
이러한 위험은 많은 DBA가 Max_seeks_for_key를보다 중간 정도 (예 : 1000 이상)로 줄이려는 이유를 강조합니다. 값을 낮추면 최적화가 인덱스 카디널리티가 해당 임계 값을 초과 할 때 전체 스캔보다 인덱스 사용을 선호하는 것이 좋습니다. 일반적으로 쿼리 속도를 향상시키고 일반적인 워크로드의 자원 소비를 줄입니다.
결론적으로, 매우 높은 max_seeks_for_key는 Optimizer를 제한하지 않기 때문에 안전 해 보일 수 있지만, 실제로는 조기 전체 테이블 스캔, 특히 효율적으로 인덱싱 해야하는 대형 데이터 세트에서 조기 전체 테이블 스캔으로 인해 쿼리 성능이 저하되고 낭비 된 자원 및 대기 시간이 높아질 수 있습니다.