>  기사  >  주제  >  PHP 애플리케이션의 성능을 크게 최적화하기 위해 MySQL 인덱스 생성

PHP 애플리케이션의 성능을 크게 최적화하기 위해 MySQL 인덱스 생성

WBOY
WBOY앞으로
2022-12-29 16:21:291894검색

이 기사는 PHP 애플리케이션의 성능을 크게 최적화하기 위한 인덱싱 관련 내용을 주로 소개하는 mysql에 대한 관련 지식을 제공합니다. 모두에게 도움이 되기를 바랍니다.

PHP 애플리케이션의 성능을 크게 최적화하기 위해 MySQL 인덱스 생성

원인

친구가 두 달 전 빠른 온라인 홍보를 위해 프로젝트를 하려고 했고, 특정 회사의 소스코드를 직접 구매해서 판매자에게 온라인 배포를 요청했습니다. 소스코드를 본 후 친구에게 직접 이렇게 말했습니다: '나 속았어.

다음과 같은 평가를 위한 근거가 있습니다.

  • 실시간에 가까운 애플리케이션으로서 핵심 코드는 PHP로 작성되었으며, 여러 시나리오의 동시 및 반복 요청은 데이터베이스 테이블 레코드를 통해 제어됩니다.

  • PHP 개발에는 문제가 없지만, 다른 엔지니어는 CLI 모드에 대해 모르는 것 같았으나 프로그램의 논스톱 실행을 위해 예약된 작업(crontab)을 사용했기 때문에 매일 수십 개의 컬 예약된 작업이 실행되었습니다. 분
  • 코드에는 .php, class1-1.php 등이 많아 한눈에 그 존재 목적을 알기 어렵습니다. 데이터베이스를 읽기 위해 반복하고 있으며 명명 규칙이 혼란스럽습니다.
  • 물론 돈을 벌 수 있는 코드는 좋은 코드(상대방이 이 코드를 통해 돈을 버는 코드)이기 때문에 그것에 너무 연연하지는 않습니다. 초기 생각에는 4코어 8G 구성으로는 1만명의 고객에게 서비스를 제공하기 어렵지만 5,000명이면 충분할 것이라고 생각했습니다.
  • Turning

  • 이번 주에만 갑자기 Alibaba Cloud로부터 CPU 사용량이 너무 높다는 알람 문자 메시지와 이메일을 자주 받았습니다. 마케팅 프로모션이 잘 진행되고 있고, 이용자 수도 눈에 띄게 늘었다고 생각하시나요? 친구들한테 물어보니 이용자가 300명도 안됐어요!

그러다가 이 코드의 실제 성능이 생각보다 나빴고 심각한 성능 문제가 있다는 것을 깨달았습니다. 이 리소스 소비율에 따르면 하드웨어 업그레이드는 끝없는 구덩이이며 성능 최적화는 올바른 방법입니다.

성능 최적화

PHP 애플리케이션의 성능을 크게 최적화하기 위해 MySQL 인덱스 생성코드를 받은 지 두 달이 지났습니다. 틈날 때마다 가끔 살펴보며 이미 코드의 구조와 주요 기능에 대해 전반적으로 이해하고 있습니다. 이제 심각한 성능 문제가 있으므로 성능 최적화를 시도해 볼 차례입니다.

수십 개의 예약된 작업이 쉬지 않고 실행되고 지속적으로 시스템을 구동한다는 점을 고려하면 예약된 작업과 관련된 기능을 먼저 이해해야 합니다. 내 자신의 이해를 바탕으로 더 이상 필요하지 않은 20개 이상의 계획된 작업을 먼저 중단했습니다. 쓸모없는 예약 작업을 일시 중지한 후 전체 시스템 CPU 사용량이 60% 이상으로 떨어졌고, 귀찮은 알림 문자 메시지와 이메일이 마침내 중단되었습니다. 하루를 기다려도 친구들은 기능이 영향을 받았다고 보고하지 않았는데, 이는 아이디어와 출발점이 정확하다는 것을 보여줍니다.

그런데 200명 이상의 사용자가 이렇게 리소스를 소비하고 있으니 뭔가 문제가 있는 게 틀림없습니다. 오늘 시간이 있을 때 다시 서버에 접속해서 top 명령을 실행해 보니

mysql

프로세스가 CPU 자원의 200% 이상을 차지하고 있는 것을 발견했습니다. 소스 코드를 읽어보니 MySQL의 사용량이 많은 데에는 이유가 있고 그럴 수도 있다는 것을 알지만 여전히 왜 그렇게 많은 리소스를 소비하는지 알고 싶습니다.

MySQL 서버에 로그인하여 느린 로그가 활성화되어 있는지 확인하세요. '%slow%';와 같은 변수를 표시하고 느린 쿼리 로그가 활성화되어 있는지 확인하세요.

그런 다음 로그를 확인하고 특정 SQL 문이 항상 로그에 나타납니다.

PHP 애플리케이션의 성능을 크게 최적화하기 위해 MySQL 인덱스 생성

이 SQL 문을 실행하면 380,000행 이상의 레코드가 스캔된 것을 볼 수 있습니다. 명령문에 포함된 두 테이블 중 하나에는 600개 이상의 레코드가 있고, 다른 하나에는 40,000개 이상의 레코드가 있습니다. 이는 40,000개 이상의 레코드가 포함된 전체 테이블을 여러 번 스캔하는 것과 같습니다.

그런 다음 두 테이블의 인덱스를 확인하세요. 기본 키로 자동 증가된 ID를 제외하고는 다른 인덱스가 생성되지 않습니다. explain을 사용하여 인덱스가 사용되지 않았음을 보여주는 문을 실행합니다.

PHP 애플리케이션의 성능을 크게 최적화하기 위해 MySQL 인덱스 생성

다음으로 두 테이블에 대한 쿼리 조건의 uid 및 session_id 열에 인덱스를 만듭니다. 인덱스 생성이 완료되면 눈에 보이는 CPU 사용량과 시스템 로드가 줄어듭니다. 다시 explain을 사용하여 쿼리 문을 실행합니다. 인덱스 정보가 사용되었으며 스캔된 행 수가 크게 줄었습니다.

PHP 애플리케이션의 성능을 크게 최적화하기 위해 MySQL 인덱스 생성

위 최적화 후 현재 응용 프로그램의 전체 CPU 사용량은 약 5%이며, MySQL의 CPU 사용량은 약 15%이고, 시스템 로드는 4에서 0.3으로 떨어졌습니다. 마지막으로 서버 구성을 1코어 CPU로 줄여도 당분간은 성능 문제를 걱정할 필요가 없습니다.

코드를 추가로 확인하고 로그와 결합하고 인덱스를 생성하고 일부 쿼리 문을 수정한 결과 CPU 사용량이 약 6%로 떨어졌습니다. 드디어 당분간은 더 이상 성능 문제를 걱정할 필요가 없습니다.

요약

개발 프로젝트에서 엔지니어는 "사용 가능한" 코드뿐만 아니라 "사용하기 쉬운" 코드도 작성해야 합니다. 이 예에서는 두 개의 인덱스를 생성하여 시스템 성능을 크게 향상시킬 수 있습니다. 즉, 코드를 "사용 가능"에서 "사용하기 쉬움"으로 변경합니다.

이 글에서 언급한 성능 최적화는 운영과 유지 관리에 중점을 두고 있으며 코드에서의 성능 최적화는 아직 다루지 않았습니다. 그러나 일반적인 원칙은 정확합니다. 캐시를 더 많이 사용하고 느린 IO 장치의 동기 읽기를 최대한 줄이는 것입니다.

추천 학습: "mysql 비디오 튜토리얼", "PHP 비디오 튜토리얼"

위 내용은 PHP 애플리케이션의 성능을 크게 최적화하기 위해 MySQL 인덱스 생성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 tlanyan.me에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제