데이터베이스 서버의 높은 iowait 최적화 사례
1. 특정 테스트 환경에서는 SQL이 느리게 실행되는 반면 다른 테스트 환경에서는 SQL이 매우 빠르게 실행된다는 개발 피드백입니다. 두 환경의 구성은 동일하며 mysql 서버만 배포됩니다.
2. top 명령을 실행하여 느린 SQL을 사용하는 머신의 디스크 iowait가 빠른 SQL을 사용하는 머신보다 훨씬 높은 것을 확인합니다. 이는 SQL이 테이블을 읽어야 하는데, 테이블의 크기가 크고, 스캔해야 할 행의 개수도 많기 때문에 SQL 실행이 느려지는 주된 원인으로 추측됩니다.
3. 머신 iowait가 높아지는 원인은 무엇입니까? iotop을 실행하면 io를 소비하는 프로세스가 주로 mysql이며, 주로 mysql에서의 읽기 작업인 것으로 나타났습니다.
4. 대용량 테이블에서 데이터를 지속적으로 쿼리하는 다른 고주파 쿼리 문이 있어야 하며 쿼리 중에 인덱스를 사용하지 않을 수 있으므로 스캔할 테이블 행 수가 많아 고주파 IO가 발생할 수 있습니다. 작업이 발생하여 IO 작업이 필요한 다른 SQL이 느리게 실행됩니다.
5. 어떤 SQL이 원인인가요? 일반 로그를 켜보니 수집된 문이 너무 많고, 오버헤드가 높은 SQL을 쉽게 찾을 수 없다는 사실을 발견했습니다.
6. 느린 로그를 켜고, 느린 쿼리를 캡처하려면 long_query_time을 1로 설정하고, pt-ioprofile을 사용하여 mysql 데이터 파일에서 더 많은 io를 소비하는 파일을 추적하세요.
7. 느린 로그(pt-query-digest를 사용하여 집계할 수 있음)와 pt-ioprofile의 결과에 따르면 실제로 전체 테이블을 스캔해야 하는 두 가지 일반적인 SQL이 있으며 해당 테이블은 다음과 같습니다. 매우 커서 디스크 오류가 발생합니다.
8.그럼 남은 문제는 테이블이나 쿼리를 최적화하는 것입니다. 가장 간단하고 직접적인 방법은 적절한 인덱스를 구축하여 쿼리 성능을 향상시키고 테이블에서 스캔되는 행 수를 줄이는 것입니다. 계속해서 성능을 짜내야 하는 경우 SQL의 작성 방법을 최적화하고 조정하여 문제를 해결할 수 있습니다. 테이블 구조 및 매개변수 구성 조정.
9. 이익이 가장 큰 방법부터 시작하여 먼저 SQL 문을 평가하고, 문 조건에 따라 각 필드의 데이터 분포를 확인하고, 해당 테이블에서 인덱스 또는 다중 열 결합 인덱스를 생성하는 합리성을 평가합니다. explain 등을 통해 field를 선택하고 적합한 index를 생성합니다.
10. 마지막으로 인덱스가 구축된 후 전체 테이블을 스캔해야 하는 원래 명령문이 인덱스를 통해 스캔되는 행 수를 효과적으로 줄일 수 있으며, 그러면 서버의 iowait 항목이 줄어드는 것으로 나타났습니다. , SQL의 느린 실행 속도에 대한 원래 피드백은 개선될 수 있지만 여전히 이상적이지는 않습니다.
11. 마지막으로 느린 명령문에 해당하는 테이블에 인덱스를 구축하고 where 조건에 사용된 잘못된 값 유형을 수정함으로써 SQL 문의 실행 속도가 크게 향상되었으며 서버의 전체 IO 소비가 감소했습니다. 크게 감소했습니다.
12. pt-query-digest를 사용하여 최적화된 mysql 서버에서 생성된 느린 로그를 집계하고 pt-ioprofile을 사용하여 최적화된 mysql 데이터 파일의 io 점유율을 분석하여 최적화 전후의 차이를 이해할 수 있습니다.
위 내용은 높은 iowait로 MYSQL 데이터베이스 서버를 최적화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!