그래서 저는 우리 리그에 있는 핀볼 기계의 높은 점수를 추적하기 위해 작은 데이터베이스를 구축하려고 합니다. AI ID 열과 이메일 주소가 포함된 열만 있는 사용자 테이블이 있습니다. 그런 다음 AI ID 열인 게임 테이블과 기계 이름이 있습니다. 다대다 관계이기 때문에 user_id, game_id 및 Score를 열로 포함하는 "scores"라는 세 번째 테이블을 만들었습니다.
편집: 포함된 읽기 코드:
으아악비슷한 코드를 사용하여 게임이 이미 데이터베이스에 나열되어 있는지 확인합니다. 게임의 ID 번호와 세 번째 부분의 이메일 주소를 가져와야 합니다. 세 번째 부분은 사용자가 이미 해당 게임에 대한 점수를 가지고 있는지, 이미 점수가 있는지, 새 점수가 더 높은지 확인하는 것입니다.
으아악코드가 제대로 작동하는 것 같지만 속도가 매우 느립니다. 또한 스크립트가 시간 초과되거나 수천 개의 레코드 후에 어떤 일이 발생하는 것 같습니다. 이 일을 수행하는 더 좋은 방법이 있나요?
Python으로 다시 코딩해 보았는데 속도가 더 느려지고 행이 데이터베이스에 삽입되지도 않는 것 같았습니다. 나는 Python을 거의 알지 못합니다. 아마도 도움이 되지 않을 것입니다.
배열을 만들고 삽입해야 할 항목을 저장한 다음 한 번에 100개의 행을 삽입하거나 그런 식으로 생각하고 있었는데 점수 조인 테이블의 ID를 가져와야 합니다. 또한 데이터베이스에서 UNIQUE 제약 조건을 사용하는 것을 고려하고 있으며 이를 사용하여 중복 이메일 주소나 게임을 방지하기 위해 삽입 코드를 다시 작성하는 방법을 알아내려고 노력하고 있습니다.
아직 개선의 여지가 많습니다. 데이터베이스 속도와 관련하여 일반적으로 주요 목표는 데이터베이스 서버에 대한 적중 횟수를 줄이는 것입니다.
먼저 각 CSV 행에 대해 ID로 이메일 쿼리를 수행하려고 하지만 반드시 그럴 필요는 없습니다. 최대로 사용자당 한 번씩 수행하고 캐시해야 합니다. 더 좋은 점은 전체 컬렉션에 대해 한 번만 수행하여 전체 내용을 메모리 배열로 읽을 수 있다는 것입니다. 다음과 같습니다:
으아악다음과 같은 배열이 제공됩니다.
으아악이 작업은 스크립트 시작 부분에서 한 번 실행하고 내내 메모리에 유지하세요. 이를 통해 특정 이메일의 ID를 즉시 찾을 수 있습니다. 이렇게 하면 데이터베이스에서 7999개의 클릭이 삭제됩니다. 본질적으로 CPU 및 디스크 시간을 위해 메모리를 거래하고 있습니다. 아직 배열에 없는 이메일을 발견하면 해당 이메일을 삽입하여 배열에 추가할 수 있습니다.
다음으로 준비를 루프 반복 외부로 이동합니다. 이렇게 하면 데이터베이스에서 최소 3 * 7999 클릭이 삭제되고 최대 5 * 7999 클릭도 삭제됩니다.
다음에는 더 쉽고 참조를 올바르게 처리할 수 있도록explore() 대신 fgetcsv()를 사용하세요. 단일 삽입을 수행하기 전에 전체 CSV를 처리합니다. 대부분의 레코드를 그냥 버릴 생각이라면 그렇게 많은 양의 데이터베이스 트래픽을 생성하는 것은 어리석은 일입니다. 따라서 가장 높은 값을 먼저 계산한 후 다음만 사용하여 데이터베이스에 액세스하세요.
으아악주어진 입력 파일:
으아악이렇게 하면 각 사용자의 최고 점수 배열이 생성됩니다.
으아악그런 다음 해당 배열을 반복하고 해당 레코드만을 기반으로 삽입/업데이트를 수행할 수 있습니다. 이렇게 하면 중복된 각 CSV 행에 대해 두 개의 쿼리가 저장됩니다.
으아악email, game_id 및 Score 매개변수를 사용하여 저장 프로시저를 만듭니다. 프로세스가 모든 SQL 작업을 수행하도록 하십시오. 귀하의 PHP 코드는 프로시저를 호출하는 단일 루프로 축소됩니다. 결과는 더 빠르고 유지 관리가 쉬워야 합니다.
으아악루프가 여전히 너무 느린 경우 속도 저하에 대한 다른 이유가 있을 수 있습니다.