문제 (from lunacyfoundme)
회사 인트라넷을 재구축 중인데 이전 버전에서 대량의 데이터 처리 보고서와 관련된 문제가 발생했습니다. 이전에 동기화 처리기 코드를 사용하여 이 문제를 해결했지만 매우 느리게 실행되어 최대 스크립트 실행 시간을 10~15분 연장해야 했습니다. PHP 사이트에서 대량의 데이터를 처리하는 더 좋은 방법이 있습니까? 이상적으로는 백그라운드에서 실행하고 최대한 빠르게 만들고 싶습니다. 이 프로세스에는 수천 개의 금융 데이터 처리가 포함되었으며 저는 Laravel을 사용하여 사이트를 재구축했습니다.
가장 인기 있는 답변(spin81에서):
사람들이 큐 등을 사용하라고 하는데, 좋은 생각이지만 문제가 발생하지 않는 것 같습니다. PHP. Laravel/OOP는 훌륭하지만 당신이 말하는 보고서를 생성하는 프로그램에는 문제가 없을 것 같습니다. 다른 관점에서 이 데이터를 가져오는 데 사용한 SQL 쿼리를 보고 싶습니다. 다른 사람들이 말했듯이 양식에 수천 개의 행이 있는 경우 보고서를 완료하는 데 10~15분이 걸리지 않습니다. 실제로 모든 작업을 올바르게 수행하면 수천 개의 기록을 처리하고 동일한 보고서를 1분 안에 완료할 수 있습니다.
1. 수천 개의 쿼리를 수행하는 경우 먼저 몇 가지 쿼리만 수행할 수 있는지 확인하세요. 나는 이전에 PHP 함수를 사용하여 70,000개의 쿼리를 12개의 쿼리로 줄여 실행 시간을 몇 분에서 몇 분의 1초로 줄였습니다.
2. 쿼리에 EXPLAIN을 실행하여 누락된 인덱스가 있는지 확인하세요. 한번 쿼리를 했는데 인덱스를 추가해서 효율성이 4배나 향상되었다고 해도 과언이 아닙니다. MySQL을 사용하고 있다면 이 "흑마법" 기술을 배울 수 있습니다.
3. SQL 쿼리를 수행하여 결과를 얻고 많은 숫자를 합치는 경우 SUM() 및 AVG()와 같은 함수를 사용하여 GROUP BY 문을 호출할 수 있는지 확인하세요. 일반적으로 데이터베이스가 가능한 한 많은 계산을 처리하도록 하십시오. 제가 드릴 수 있는 매우 중요한 팁 중 하나는 다음과 같습니다. (적어도 MySQL에서는) 부울 표현식은 0 또는 1의 값을 가지며, 정말 창의적이라면 SUM()과 그 친구들을 사용하여 그렇게 할 수 있습니다. 매우 놀라운 일입니다.
4. 좋습니다. PHP 측의 마지막 팁은 다음과 같습니다. 똑같이 시간이 많이 걸리는 숫자를 여러 번 계산했는지 확인하세요. 예를 들어 감자 1000봉지의 가격을 계산하는 데 비용이 많이 들지만 감자 1000봉지의 비용을 배열 등에 저장하기 전에 해당 비용을 500번 계산할 필요가 없다고 가정해 보겠습니다. 같은 계산을 반복해서 할 필요가 없습니다. 이 기술을 니모닉이라고 하며 귀하와 같은 보고서에 사용할 때 종종 놀라운 효과를 발휘합니다.