2012-12-26 4 views
0

이 서버는 큰 통계 테이블을 보유하고있는 실시간 트래픽 로그 DB를 설정합니다. 이제 30 일 전에 다시 작은 테이블을 만들어야합니다.SQL 선택 쿼리 메모리 문제

또한이 서버에는 데이터를 복사하고 마스터보다 5 초 뒤에있는 슬레이브 서버가 있습니다. 쿼리를 선택하는 서버 프로세스를 줄이기 위해이 슬레이브를 생성하여 트래픽 로그에 대한 삽입/업데이트와 함께 작동합니다.

이제는 작은 테이블로 마지막 날을 복사해야하고 여전히 "실제"DB 인 을 사용하지 말고 슬레이브에서 선택하고 실제 작은 테이블에 삽입해야합니다. (슬레이브는 읽기 작업 만 허용합니다).

저는 PHP로 작업 중이며 하나의 쿼리에서 2 개의 다른 데이터베이스를 사용하여 하나의 쿼리로이를 해결할 수 없습니다 ... 가능한 경우 알려주십시오.

두 개의 쿼리를 사용할 때 PHP MySQL 객체로 마지막 날을 지켜야합니다. 300K-650K 행의 경우 캐시 메모리 문제가되기 시작합니다. ID로 부분 선택을 사용합니다 (위치 조건에서 ID를 설정하여)하지만 자동 증가 ID 필드가없고 행 ID가 없습니다 (트래픽 데이터 ID를 저장할 때 많은 공간이 필요함) .

나는이 아이디어를 시도하고 있으며 두 번째 의견을 얻고 싶습니다.

마지막 날 (300K 행)에 PHP 메모리가 오버로드됩니다. 제한 청크 또는 새로운 아이디어를 사용할 수 있습니다. 한 번에 하나의 열을 선택하고이 열을 새로운 실제 테이블에 복사합니다. 그러나 두 번째 방법이 가능한지 나는 모른다. 삽입은 열 수준이나 행 수준에서 첫 번째 열린 공간을 봅니다. 주요 아이디어는 select ...의 크기를 줄이는 것입니다. 그래서 열을 선택하고 mysql에서 열로 삽입 할 수 있습니까?

+2

왜 사람들이 마치 사람들처럼 말하고 있습니까? 0_0 –

+3

@JackManey : 영어는 아미르의 모국어가 아니며 일부 언어의 직접 음역은 중립적 인 'it'대신 'him'또는 'her'을 사용하기 때문입니다. –

답변

0

PHP의 메모리 문제 일 경우 PDO를 사용하고 한번에 하나의 결과 행을 가져올 수 있습니다.

PHP.net에서 PDO에 대한

: 물론 여기

<?php 
function getFruit($conn) { 
    $sql = 'SELECT name, color, calories FROM fruit ORDER BY name'; 
    foreach ($conn->query($sql) as $row) { 
     print $row['name'] . "\t"; 
     print $row['color'] . "\t"; 
     print $row['calories'] . "\n"; 
    } 
} 
?> 
+0

여기는 PHP가 이상하게 시작되는 곳입니다. 귀하의 조언을 받아 데이터 청크를 사용하기 시작했습니다. 나는 2000 줄의 점프에서 한도를 앞 당기기 위해 루프를 사용했다. 하지만 재미있는 것은 PHP 메모리 사용과 메모리 피크 기능을 사용하기 시작한 때입니다. chunk 메소드가 큰 스케일에서 작동하지 않는 이유는 루프에 새로운 값을 설정하면 메모리를 해제하지 않기 때문입니다 새로운 설정 전에 무엇이 었는지 알 수 있습니다. PHP에서 메모리를 유지하려면 unset 또는 null을 사용해야합니다. –

0

PHP는 시작이 이상한 곳을 ... 내가 당신의 충고를 따랐다 및 데이터 청크를 사용하기 시작합니다. 나는 2000 줄의 점프에서 한도를 앞 당기기 위해 루프를 사용했다. 하지만 재미있는 것은 PHP 메모리 사용과 메모리 피크 기능을 사용하기 시작한 때입니다. chunk 메소드가 큰 스케일에서 작동하지 않는 이유는 루프에 새로운 값을 설정하면 메모리를 해제하지 않기 때문입니다 새로운 설정하기 전에 무엇이 었는지 알 수 없으므로 PHP에서 메모리를 유지하기 위해 unset 또는 null을 사용해야합니다. -