복붙노트

[SQL] 빨리 mysql_num_rows도 () 또는 'SELECT COUNT ()'이다 - SQL & PHP?

SQL

빨리 mysql_num_rows도 () 또는 'SELECT COUNT ()'이다 - SQL & PHP?

난 그냥 말 그대로 그냥 테이블의 행 수를 얻을 꿔 경우에 가장 효과가있는 방법 궁금하네요.

$res = mysql_query("SELECT count(*) as `number` FROM `table1`");
$count = mysql_fetch_result($res,0,'number');

또는

$res = mysql_query("SELECT `ID` FROM `table1`");
$count = mysql_num_rows($res);

누구나 여기에 대한 괜찮은 테스트를 수행?

해결법

  1. ==============================

    1.그것을 반환하기 전에는 mysql_query ()는 PHP를 pcrocess로 MySQL의 모든 결과 레코드를 전송 (mysql_unbufferd_query 달리 ()). 혼자가 느린 mysql_num_rows도 () 버전을 만들 것입니다.

    그것을 반환하기 전에는 mysql_query ()는 PHP를 pcrocess로 MySQL의 모든 결과 레코드를 전송 (mysql_unbufferd_query 달리 ()). 혼자가 느린 mysql_num_rows도 () 버전을 만들 것입니다.

    또한 MySQL이 실제 데이터를 타격하지 않고 테이블의 인덱스에서 (*) 요청 횟수를 제공 할 수 있습니다 (의 MyISAM 같은) 일부 엔진. 하는 SELECT *이 전체 테이블 스캔 반면 결과에 foo에와 MySQL로부터 모든 단일 데이터 집합을 읽을 수있다.

  2. ==============================

    2.더 후 2,300,000 행이 데이터베이스에 테스트 입력 : 이노, 1 지브 근처 크기, 사용 xhprof

    더 후 2,300,000 행이 데이터베이스에 테스트 입력 : 이노, 1 지브 근처 크기, 사용 xhprof

    TEST1 :

        ....SELECT COUNT(id) as cnt FROM $table_name....;
           row= mysqli_fetch_assoc($res2);
       echo $row['cnt'];
            //result1:
            1,144,106
            1,230,576
            1,173,449
            1,163,163
            1,218,992
    

    TEST2 :

    ....SELECT COUNT(*) as cnt FROM $table_name....;
           row= mysqli_fetch_assoc($res2);
       echo $row['cnt'];
    //result2:
    1,120,253
    1,118,243   
    1,118,852
    1,092,419
    1,081,316
    

    TEST3 :

     ....SELECT * FROM $table_name....;
        echo mysqli_num_rows($res2);
        //result3:
    7,212,476
    6,530,615
    7,014,546
    7,169,629
    7,295,878
    

    테스트 4 :

         ....SELECT * FROM $table_name....;
            echo mysqli_num_rows($res2);
            //result4:
    1,441,228
    1,671,616
    1,483,050
    1,446,315
    1,647,019
    

    결론: 가장 빠른 방법은 TEST2에 있습니다 :

    ....SELECT COUNT(*) as cnt FROM $table_name....;
           row= mysqli_fetch_assoc($res2);
       echo $row['cnt'];
    
  3. ==============================

    3.확실히 첫 번째. MySQL은 일반적으로 인덱스가 아닌 전체 테이블을보고하여이 작업을 수행 할 수 있습니다, 그리고 당신의 MyISAM (기본값)을 사용하는 경우, 테이블의 행 수는 테이블 메타 데이터에 저장되어 즉시 반환됩니다.

    확실히 첫 번째. MySQL은 일반적으로 인덱스가 아닌 전체 테이블을보고하여이 작업을 수행 할 수 있습니다, 그리고 당신의 MyISAM (기본값)을 사용하는 경우, 테이블의 행 수는 테이블 메타 데이터에 저장되어 즉시 반환됩니다.

    두 번째 방법은 전용 메모리에 전체 테이블을 읽을뿐만 아니라 클라이언트가 행을 계산하기 전에 네트워크를 통해 클라이언트로 전송하지 않습니다. 매우 낭비!

  4. ==============================

    4.난 정말 시험이 필요하다 생각하지 않습니다.

    난 정말 시험이 필요하다 생각하지 않습니다.

    SQL 쿼리에 COUNT를하는

    1) 하나의 데이터 행이를 다시 송신     클라이언트 (대신 모든 행의)

    2) SQL이 수를 할 수 있습니다     당신을 위해 가능성이 항상있는을 것입니다     빠른 PHP보다합니다.

  5. ==============================

    5.내가 더 빨리 될 것입니다 (1) 계산 같아요

    내가 더 빨리 될 것입니다 (1) 계산 같아요

    $res = mysql_query("SELECT count(1) as `number` FROM `table1`");
    $count = mysql_fetch_result($res,0,'number');
    

    제안 된 방법을 시도하지 않은 있지만, 첫 번째 차종 데이터베이스가 모든 레코드를 가져 와서 데이터베이스에 계산, 두 번째 차종 데이터베이스는 모든 레코드에 대해 별도의 필드를 가져오고 서버에서 결과의 수를 계산합니다. 엄지 손가락의 규칙 당신이 걸릴 것입니다 적은 시간 때문에 나는 업데이트 첫 번째 방법에 대한 투표 것 특정 레코드를 페치 적은 데이터로 (상수의 수를 가져온 모든 레코드에 대한 상수를 가져 와서 계산).

  6. ==============================

    6.인덱스와 inodb로 카운트를 사용하면 너무 느린 그것을 만들지 만, mysqli_num_rows와 함께 사용할 때 어떤 지체없이 반환합니다. 당신은 부하에 두 번째의 일부를받지 않을 것 http://ssajalandhar.org/generalinstruction-0-1-0.html에서 mysqli_num_rows 결과를 확인할 수 있습니다. 나를 위해 mysqli 끝내 작동합니다.

    인덱스와 inodb로 카운트를 사용하면 너무 느린 그것을 만들지 만, mysqli_num_rows와 함께 사용할 때 어떤 지체없이 반환합니다. 당신은 부하에 두 번째의 일부를받지 않을 것 http://ssajalandhar.org/generalinstruction-0-1-0.html에서 mysqli_num_rows 결과를 확인할 수 있습니다. 나를 위해 mysqli 끝내 작동합니다.

  7. from https://stackoverflow.com/questions/2485224/sql-php-which-is-faster-mysql-num-rows-or-select-count by cc-by-sa and MIT license