느린 WordPress 데이터베이스 쿼리를 찾고 수정하는 데 유용한 트릭
게시 됨: 2019-04-17중간 정도의 SQL 문의는 WordPress 애플리케이션 개발 사이트의 실행을 방해할 수 있습니다. 때때로 중간 정도의 조회는 그런 식으로 수행되어서는 안 되는 부적절하게 구조화된 SQL의 후유증입니다.
게다가 어떤 경우에는 중간 정도의 문의가 실제로 특정 시점에서 빠른 질문이었지만 사이트가 더 노련해지면서 문의는 점점 느려지고 확장된 데이터베이스를 인식할 수 없었습니다.
SQL이 어떻게 적절해졌는지에도 불구하고 WordPress 애플리케이션 개발에서 문제를 발견하고 수정하기 위해 몇 가지 접근 방식을 조사해야 합니다. 여기저기서 특정 웹 애플리케이션이 필요할 수 있고 사용자 정의 개선을 수행하기 위한 충분한 에너지, 적성 또는 지출 계획이 없을 수 있습니다. 준비 없이 생성하는 것이 일부 문제에 대한 답이 될 수 있지만 현재 코드 기반에서 시작하는 것보다 더 오래 걸릴 수 있습니다. WordPress는 처음에 블로깅 단계로 구성되었으며 그 점에서 계속 탁월합니다. 그것이 무엇이든 간에 그것은 완전한 기능을 갖춘 콘텐츠 관리 시스템(CMS)으로 발전했으며 몇 가지 목적을 위해 강력한 웹 애플리케이션을 신속하고 맞춤 개선보다 근본적으로 낮은 지출 계획으로 만들 수도 있습니다. WordPress는 내장 개발 응용 프로그램을 제공하지만 웹 응용 프로그램에 사용하여 더욱 유용하게 사용할 수 있습니다. 고유한 페이지 및 게시물 구조는 많은 용도로 활용될 수 있지만, 사용자 지정 정보 및 필드를 포함, 검색 또는 질문, 제어 및 표시해야 하는 경우에는 약간의 추가 작업이 필요합니다.
느린 쿼리 찾기
중간 질문의 기원을 찾는 데는 두 단계가 포함됩니다.
- 어떤 질문이 실제로 온건한 질문인지 알아내십시오.
- 그들을 운영하는 프로그램을 식별합니다.
중간 정도의 질문을 발견할 수 있는 두 개의 모듈과 하나의 SaaS를 살펴봐야 합니다.
쿼리 모니터
현재 실행 중인 페이지에 대한 정보를 얻기 위해 이 모듈을 사용할 수 있습니다. WordPress의 내부 활동에 대한 전체 데이터 클러스터에도 불구하고 다음을 포인트별로 분류합니다.
- 이 요구에 대해 얼마나 많은 질문이 발생했습니까?
- 페이지에서 가장 많은 시간이 소요된 문의는 무엇입니까?
- SQL 질문에 가장 많은 에너지를 투자한 역량은 무엇입니까?
- 이러한 문의가 모듈, 주제 또는 WordPress 센터에서 시작되었는지 여부
조회 화면은 불안한 빨간색 내용이 포함된 중간 질문도 인식하므로 문제 SQL을 선택하는 것이 매우 간단합니다.
디버그 바
서리가 내린 적당한 SQL을 찾기 위한 또 다른 놀라운 도구는 오래되고 신뢰할 수 있는 Debug Bar 모듈입니다. 디버그 막대는 페이지가 다음과 같은 문제로 로드될 때 WordPress의 내부 기능에 대한 하나의 데이터를 제공합니다.
- WP_Query의 매개변수
- 데이터 요청(카운팅 개편 규칙 조정)
- 현재 페이지에서 생성된 SQL 조회
디버그 표시줄에서 SQL 다음을 활성화하려면 사용자가 사이트의 어딘가에 SAVEQUERIES를 허용하도록 지정해야 합니다(예: wp-config.php에서).
주의: SAVEQUERIES는 사이트의 실행에 영향을 미치므로 생성 서버에서 사용하면 안 됩니다. 단, 전진기에서는 사용할 수 있습니다.
디버그 표시줄을 사용하여 중간 정도의 SQL을 찾는 것은 매우 쉽지 않습니다. 예를 들어, 정렬 가능한 테이블을 제공하거나 사용자에 대한 중간 정도의 질문을 제공하지 않습니다. 디버그 막대가 제공하는 것은 사용자를 질문의 출처 방향으로 정확하게 안내하는 용량 팔로우입니다.
이것은 로드된 문서와 실행 중인 조회의 결과인 용량에 대한 요약입니다. 대부분의 경우 요약에 대한 절대적인 계속 섹션에 관심이 있습니다. 이것은 중간 질문이 실행된 곳이자 사냥을 시작해야 하는 곳입니다. 이 질문을 표시하는 모든 용량을 설정하는 것의 편리한 점은 어떤 경우에도 SQL이 실행된 이유에 대한 통찰력을 드러낼 수 있다는 것입니다.
새로운 유물
NewRelic은 WordPress 애플리케이션 개발을 포함한 웹 애플리케이션 개발의 실행을 측정하고 선별하는 관리입니다. 관리는 사이트 실행에 대한 데이터의 메트릭 톤을 제공합니다. NewRelic이 SQL 문의에 대한 세부 정보를 매 순간 사용자에게 제공하는 정보에서 방향 감각을 모두 잃는 것은 어려운 일입니다.
NewRelic과 이전에 참조한 모듈 사이에는 두 가지 주목할 만한 대조가 있습니다.
- NewRelic은 각 함수에 소요된 시간의 정확한 계산에 이르기까지 PHP 실행에 관한 훨씬 더 많은 통찰력을 제공합니다.
- NewRelic은 사이트에 대한 각 수요를 보이지 않는 곳에서 추적하므로 나중에 중간 SQL을 발견하기 위해 참조할 수 있습니다. 모듈은 그에게 현재 페이지를 제공합니다.
NewRelic이 사이트 실행에 대한 일반적인 데이터를 제공하는 무료 배열 수준을 갖는 것이 중요하지만, 단일 요구 사항을 확인하고 중간 정도의 문의를 찾기 위해 멋진 확률과 끝을 위해 유료 배열로 이동해야 합니다.
EXPLAIN으로 느린 쿼리 이해하기
이 시점까지 장치는 중간 정도의 질문을 찾기 위해 보호되었습니다. 현재로서는 그러한 문의가 일을 방해하는 이유를 알아야 합니다.
MySQL EXPLAIN 워치워드는 무슨 일이 일어나고 있는지 명확히 하기 위해 활성화할 수 있습니다. 문의 시작 부분에 EXPLAIN을 추가하면 MySQL이 어떻게 질문을 실행하는지 알 수 있습니다. 복잡한 쿼리의 경우 EXPLAIN은 SQL에서 중간 수준의 하위 쿼리 또는 낭비적인 활동과 같은 중간 수준의 초점을 구별하는 데 도움이 될 수 있습니다.
느린 쿼리 수정
쿼리가 보통이라는 것을 깨닫고 EXPLAIN이 사용자에게 이유를 밝혔으므로 졸음 문제를 해결하기 위해 몇 가지 선택 사항을 살펴봐야 합니다.
옵션 1: 질문 왜곡
게시물 편집 화면을 매우 느리게 만드는 질문이 있을 수 있습니다. 문의는 사용자 정의 필드의 메타 상자의 일부였습니다.
SQL의 확실한 부분은 ks29so_postmeta 테이블에서 meta_keys 목록을 가져오는 것입니다. 이 목록은 밑줄 기호로 시작하지 않을 가능성이 높습니다. GROUP BY 설명은 각 결과가 특별하다는 것을 의미합니다.
이 조회를 여러 번 실행하면 소요될 수 있는 시간은 다음과 같습니다.
1.7145초
1.7911초
1.8076초
1.7707초
1.8456초
유사한 출력을 생성하는 쿼리를 개발할 수 있습니다. 일종의 meta_keys 중 하나로 선택해야 합니다. Exceptional은 특정에 해당하는 단어로, SQL 설명과 동일하게 발생합니다!
옵션 2: 인덱스 추가
사용자가 설정된 MySQL 테이블에 대해 SQL 질문을 실행하는 동안 특정 조회에 중요한 행이 무엇인지 이해하기 위해 전체 테이블을 검사해야 합니다. 테이블이 커지는 시점에서 확인하는 데 시간이 꽤 걸립니다.
그것이 MySQL 레코드가 들어오는 곳입니다. 목록은 테이블의 정보를 가져와서 정보를 찾는 데 훨씬 덜 까다롭도록 정렬합니다. 정보를 특정 방식으로 정렬함으로써 파일은 각 조회에 대해 MySQL이 수행하는 필터링 측정을 줄이는 데 도움이 됩니다.
파일은 단일 세그먼트 또는 다양한 섹션에 추가할 수 있습니다.
meta_key에 있는 파일의 경우 첫 번째 SQL 질문 시간은 다음과 다소 비슷합니다.
0.0041초
0.0023초
0.0030초
0.0025초
0.0019초
이것은 매우 똑똑합니다.
파일에 대한 경고 표현: INSERT가 열을 만들거나 af 테이블에서 UPDATE를 사용할 때마다 목록이 다시 결정되며 이는 비용이 많이 드는 활동이 될 수 있습니다. 레코드를 사용하면 테이블에서 더 빠르게 정독할 수 있지만 쓰기는 더 느립니다. 적절하게 배치된 인덱스 목록은 매우 잘 작동할 수 있지만 목록이 데이터베이스에 미치는 일반적인 영향을 확인하지 않고 그것에 집착해서는 안 됩니다.
옵션 3: 쿼리 결과 캐시
일단 적당한 질문이 있다는 것을 깨닫습니다. 질문을 바꾸는 것보다 오히려 조사의 후유증을 그냥 버리는 시나리오가 있을 수 있다. 그렇게 하면 조사가 얼마나 정기적으로 수행되는지를 제한할 수 있고 그는 "자유 통행증"을 더 자주 받게 될 것입니다.
WordPress Transients API는 쿼리를 예약하는 방법 중 하나입니다. 과도기는 비용이 많이 드는 작업의 결과를 제거하는 데 사용됩니다. 예를 들어,
- 외부 사이트에 대한 요청(예: 진행 중인 Facebook 게시물 받기)
- 느린 처리 덩어리(예: 관습적인 관절로 거대한 현을 찾는 경우)
- 느린 데이터베이스 조회!
접근 방식 선택
여러 대안이 제시되어 있으며 이 온건한 조사를 이해하기 위한 17가지 다른 접근 방식이 있을 가능성이 큽니다. 어떤 접근 방식을 취해야 합니까?
선택 1(질문 변경)은 훌륭한 결과를 가져왔습니다. 그러나 수정된 조회가 일반적으로 유사한 결과를 갖지 않을 가능성을 고려해야 합니다. 다소 엉뚱한 질문으로 코드를 무의식적으로 중단시킬 수 있습니다.
대안 2(기록 포함)는 조회에 사용된 테이블 및 섹션에 따라 지속적으로 생각할 수 없습니다. WordPress 애플리케이션 개발 센터 테이블 때문에 레코드의 다른 효과에 대해 강조해야 합니다.
- 센터 새로 고침 루틴에 추가 목록이 필요합니까?
- 파일을 포함하면 INSERT 및 UPDATE와 유사한 다양한 문의가 완화됩니까?
대안 3(노숙자를 통해 결과 예약)은 미미한 영향을 미칩니다. 사용자가 첫 번째 문의를 변경할 필요가 없고 데이터베이스 구조를 조정할 필요가 없습니다.
일반적으로 사람들은 옵션 3을 선택합니다. 특정한 경우에는 수정하려는 질문이나 SQL 문제가 있는 특정 사이트에 따라 다른 대안을 선택할 수 있습니다. 대부분의 실행 문제에 대한 만능 대응책은 확실히 없으므로 다른 사람의 결정에 따라 다르게 할 수 있습니다. 또는 잠시 지연 없이 세 가지 중 하나를 모두 시도하십시오!
업데이트 유지
여기에서 진정한 문제를 스케치했습니다. CSS-Tricks의 사용자 정의 필드 상자는 일부 극도로 온건한 데이터베이스 조회에 대한 위반자였습니다. 마찬가지로 잠재적인 준비를 위한 다양한 방법을 스케치했습니다.
새로운 아이디어 구상
단순히 질문을 수정하거나 목록을 포함하는 것보다 더 많은 작업을 포함하는 질문 실행을 시도하고 가속화할 수 있는 다양한 방법론이 있습니다. 질문에서 가장 느린 부분 중 하나는 테이블을 조인하여 클라이언트 ID에서 항목 ID로 이동하는 작업이며 각 클라이언트에 대해 이 작업을 수행해야 합니다.
모든 라이센스에 대한 클라이언트 ID 및 항목 ID와 함께 허가 정보를 저장하는 테이블을 만들고 특정 클라이언트에 대한 조회를 통해 정보를 비정규화할 수 있습니다. INSERT/UPDATE/DELETE에 대한 MySQL 트리거를 사용하여 테이블을 라이센스 테이블(또는 정보가 어떻게 변경될 수 있는지에 의존하는 다른 테이블)로 수정해야 하지만 이렇게 하면 해당 정보에 대한 질문 실행이 크게 향상됩니다.
따라서 다양한 조인이 MySQL에서 질문을 완화하는 경우 조회를 적어도 두 개의 관절로 나누고 PHP에서 독립적으로 실행한 다음 나중에 코드에서 결과를 수집하고 채널링하는 것이 더 빠를 수 있습니다.