이 기사는 PHP 애플리케이션의 성능을 크게 최적화하기 위한 인덱싱 관련 내용을 주로 소개하는 mysql에 대한 관련 지식을 제공합니다. 모두에게 도움이 되기를 바랍니다.
친구가 두 달 전 빠른 온라인 홍보를 위해 프로젝트를 하려고 했고, 특정 회사의 소스코드를 직접 구매해서 판매자에게 온라인 배포를 요청했습니다. 소스코드를 본 후 친구에게 직접 이렇게 말했습니다: '나 속았어.
다음과 같은 평가를 위한 근거가 있습니다.
실시간에 가까운 애플리케이션으로서 핵심 코드는 PHP로 작성되었으며, 여러 시나리오의 동시 및 반복 요청은 데이터베이스 테이블 레코드를 통해 제어됩니다.
Turning
코드를 받은 지 두 달이 지났습니다. 틈날 때마다 가끔 살펴보며 이미 코드의 구조와 주요 기능에 대해 전반적으로 이해하고 있습니다. 이제 심각한 성능 문제가 있으므로 성능 최적화를 시도해 볼 차례입니다.
수십 개의 예약된 작업이 쉬지 않고 실행되고 지속적으로 시스템을 구동한다는 점을 고려하면 예약된 작업과 관련된 기능을 먼저 이해해야 합니다. 내 자신의 이해를 바탕으로 더 이상 필요하지 않은 20개 이상의 계획된 작업을 먼저 중단했습니다. 쓸모없는 예약 작업을 일시 중지한 후 전체 시스템 CPU 사용량이 60% 이상으로 떨어졌고, 귀찮은 알림 문자 메시지와 이메일이 마침내 중단되었습니다. 하루를 기다려도 친구들은 기능이 영향을 받았다고 보고하지 않았는데, 이는 아이디어와 출발점이 정확하다는 것을 보여줍니다.
프로세스가 CPU 자원의 200% 이상을 차지하고 있는 것을 발견했습니다. 소스 코드를 읽어보니 MySQL의 사용량이 많은 데에는 이유가 있고 그럴 수도 있다는 것을 알지만 여전히 왜 그렇게 많은 리소스를 소비하는지 알고 싶습니다.
MySQL 서버에 로그인하여 느린 로그가 활성화되어 있는지 확인하세요. '%slow%';와 같은 변수를 표시하고 느린 쿼리 로그가 활성화되어 있는지 확인하세요.
그런 다음 로그를 확인하고 특정 SQL 문이 항상 로그에 나타납니다. 이 SQL 문을 실행하면 380,000행 이상의 레코드가 스캔된 것을 볼 수 있습니다. 명령문에 포함된 두 테이블 중 하나에는 600개 이상의 레코드가 있고, 다른 하나에는 40,000개 이상의 레코드가 있습니다. 이는 40,000개 이상의 레코드가 포함된 전체 테이블을 여러 번 스캔하는 것과 같습니다. 그런 다음 두 테이블의 인덱스를 확인하세요. 기본 키로 자동 증가된 ID를 제외하고는 다른 인덱스가 생성되지 않습니다. explain을 사용하여 인덱스가 사용되지 않았음을 보여주는 문을 실행합니다. 다음으로 두 테이블에 대한 쿼리 조건의 uid 및 session_id 열에 인덱스를 만듭니다. 인덱스 생성이 완료되면 눈에 보이는 CPU 사용량과 시스템 로드가 줄어듭니다. 다시 explain을 사용하여 쿼리 문을 실행합니다. 인덱스 정보가 사용되었으며 스캔된 행 수가 크게 줄었습니다. 위 최적화 후 현재 응용 프로그램의 전체 CPU 사용량은 약 5%이며, MySQL의 CPU 사용량은 약 15%이고, 시스템 로드는 4에서 0.3으로 떨어졌습니다. 마지막으로 서버 구성을 1코어 CPU로 줄여도 당분간은 성능 문제를 걱정할 필요가 없습니다. 코드를 추가로 확인하고 로그와 결합하고 인덱스를 생성하고 일부 쿼리 문을 수정한 결과 CPU 사용량이 약 6%로 떨어졌습니다. 드디어 당분간은 더 이상 성능 문제를 걱정할 필요가 없습니다.개발 프로젝트에서 엔지니어는 "사용 가능한" 코드뿐만 아니라 "사용하기 쉬운" 코드도 작성해야 합니다. 이 예에서는 두 개의 인덱스를 생성하여 시스템 성능을 크게 향상시킬 수 있습니다. 즉, 코드를 "사용 가능"에서 "사용하기 쉬움"으로 변경합니다.
이 글에서 언급한 성능 최적화는 운영과 유지 관리에 중점을 두고 있으며 코드에서의 성능 최적화는 아직 다루지 않았습니다. 그러나 일반적인 원칙은 정확합니다. 캐시를 더 많이 사용하고 느린 IO 장치의 동기 읽기를 최대한 줄이는 것입니다.
추천 학습: "mysql 비디오 튜토리얼", "PHP 비디오 튜토리얼"
위 내용은 PHP 애플리케이션의 성능을 크게 최적화하기 위해 MySQL 인덱스 생성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!