복붙노트

[SQL] 테이블 행 수를 얻을 수있는 가장 효율적인 방법

SQL

테이블 행 수를 얻을 수있는 가장 효율적인 방법

나는 현재 6 백만 행과 성장 데이터베이스를 가지고있다. 나는 현재 테이블에서 SELECT COUNT (ID)를 할; 내 사용자 수를 표시 할 수 있지만하기 위해 데이터베이스가 큰지고 난 수를 표시 할 수 있도록 제외한 그 모든 행을 저장할 필요가 없습니다. 나는 데이터베이스에 행의 대부분을 취소 할 수 있도록 표시하는 AUTO_INCREMENT 값을 선택하는 방법이 있나요? LAST_INSERT_ID ()를 사용하면 작동하지 않습니다.

해결법

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

    1.그것은 단지 기록 (행)의 수를 얻기에 관하여 만약 내가 사용하는 것이 좋습니다 것입니다 :

    그것은 단지 기록 (행)의 수를 얻기에 관하여 만약 내가 사용하는 것이 좋습니다 것입니다 :

    SELECT TABLE_ROWS
    FROM information_schema.tables 
    WHERE table_name='the_table_you_want' -- Can end here if only 1 DB 
      AND table_schema = DATABASE();      -- See comment below if > 1 DB
    

    (MySQL 용 적어도) 대신.

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

    2.다음은 테이블의 다음 AUTO_INCREMENT 값을 찾을 수있는 가장 성능이 좋은 방법입니다. 그것은 잠재적으로 큰 INFORMATION_SCHEMA 데이터베이스 쿼리를 필요로하지 않기 때문에, 심지어 테이블의 데이터베이스 주택 수백만 빠르다.

    다음은 테이블의 다음 AUTO_INCREMENT 값을 찾을 수있는 가장 성능이 좋은 방법입니다. 그것은 잠재적으로 큰 INFORMATION_SCHEMA 데이터베이스 쿼리를 필요로하지 않기 때문에, 심지어 테이블의 데이터베이스 주택 수백만 빠르다.

    mysql> SHOW TABLE STATUS LIKE 'table_name';
    // Look for the Auto_increment column
    

    쿼리에서이 값을 검색해야하는 경우에는 다음 INFORMATION_SCHEMA 데이터베이스에 당신이 가야한다.

    SELECT `AUTO_INCREMENT`
    FROM   INFORMATION_SCHEMA.TABLES
    WHERE  TABLE_SCHEMA = 'DatabaseName'
    AND    TABLE_NAME   = 'TableName';
    
  3. ==============================

    3.이 시도

    이 시도

    이 SQL을 실행합니다 :

    SHOW TABLE STATUS LIKE '<tablename>'
    

    상기 AUTO_INCREMENT 필드의 값을 취득

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

    4.나는 모르겠 음 하나는 다음을 제안하지 이유입니다. 이것은 단지 SQL (PHP의로 MYSQL_ASSOC를 사용하는 필요 없음)를 사용하여 AUTO_INCREMENT 값을 얻을 것이다 :

    나는 모르겠 음 하나는 다음을 제안하지 이유입니다. 이것은 단지 SQL (PHP의로 MYSQL_ASSOC를 사용하는 필요 없음)를 사용하여 AUTO_INCREMENT 값을 얻을 것이다 :

    SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
    
  5. ==============================

    5.직접 선택 쿼리를 작성하여 최대 번호를받을 경우 다음 기회 쿼리는 잘못된 값이 제공됩니다 수 있음. 예를 들면 테이블 5 개 레코드가있는 경우, 증가 ID는 6이 될 것이다, 그래서 나는 테이블이 최대 ID로 4 개 레코드가없는 (5)이 경우 4입니다 삭제 기록은 다음 증가 ID로 5 얻을 것이다 경우. 당신은 MySQL의 해상력 자체에서 정보를 얻을 수에 insted. 서면으로 PHP 코드를 다음

    직접 선택 쿼리를 작성하여 최대 번호를받을 경우 다음 기회 쿼리는 잘못된 값이 제공됩니다 수 있음. 예를 들면 테이블 5 개 레코드가있는 경우, 증가 ID는 6이 될 것이다, 그래서 나는 테이블이 최대 ID로 4 개 레코드가없는 (5)이 경우 4입니다 삭제 기록은 다음 증가 ID로 5 얻을 것이다 경우. 당신은 MySQL의 해상력 자체에서 정보를 얻을 수에 insted. 서면으로 PHP 코드를 다음

    <?
    $tablename      = "tablename";
    $next_increment     = 0;
    $qShowStatus        = "SHOW TABLE STATUS LIKE '$tablename'";
    $qShowStatusResult  = mysql_query($qShowStatus) or die ( "Query failed: " . mysql_error() . "<br/>" . $qShowStatus );
    
    $row = mysql_fetch_assoc($qShowStatusResult);
    $next_increment = $row['Auto_increment'];
    
    echo "next increment number: [$next_increment]";
    ?>
    
  6. ==============================

    6.아이디 DESC LIMIT 1 캔 반환 최대 ID로 테이블 순서와 ID를 선택하지 증가 ID를 자동. 모두 몇 가지 조건이 다르다

    아이디 DESC LIMIT 1 캔 반환 최대 ID로 테이블 순서와 ID를 선택하지 증가 ID를 자동. 모두 몇 가지 조건이 다르다

  7. ==============================

    7.그런 다음 "상태 표시"에 대한 권한이없는 경우, 가장 좋은 방법은, 두 개의 트리거하고 억 개 기록 테이블의 행 수를 유지하는 새 테이블을 만드는 것입니다.

    그런 다음 "상태 표시"에 대한 권한이없는 경우, 가장 좋은 방법은, 두 개의 트리거하고 억 개 기록 테이블의 행 수를 유지하는 새 테이블을 만드는 것입니다.

    예:

    TableA의 >> 억 개 기록 TableB의 >> 1 열 및 1 행

    표 (삽입 트리거) 증가에 삽입 쿼리는 1 TableB의에 의해 행 값이있을 때마다 TableA의에 삭제 쿼리가있을 때마다 TableB의 1로, 감소시킵니다 행 값 (트리거 삭제)

  8. ==============================

    8.INFORMATION_SCHEMA 제안 옆이 :

    INFORMATION_SCHEMA 제안 옆이 :

    SELECT id FROM table ORDER BY id DESC LIMIT 1
    

    또한 매우 빠르게해야한다, (나는 AUTO_INCREMENT의 경우 수 있어야합니다 생각) id 필드에 인덱스 거기에 제공

  9. ==============================

    9.

    $next_id = mysql_fetch_assoc(mysql_query("SELECT MAX(id) FROM table"));
    $next_id['MAX(id)']; // next auto incr id
    

    그것이 도움 바랍니다 :)

  10. ==============================

    10.제어 장치

    제어 장치

    SomeNameModel::_getNextID($this->$table)
    

    모델

    class SomeNameModel extends CI_Model{
    
    private static $db;
    
    function __construct(){
      parent::__construct();
      self::$db-> &get_instance()->db;
    }
    
    
    function _getNextID($table){
      return self::$db->query("SHOW TABLE STATUS LIKE '".$table."' ")->row()->Auto_increment;
    }
    
    ... other stuff code
    
    }
    
  11. ==============================

    11.이 답변 중에 꽤 잘 될 것 같다 없습니다. 나는 그들 모두를 시도했다. 여기 내 결과입니다.

    이 답변 중에 꽤 잘 될 것 같다 없습니다. 나는 그들 모두를 시도했다. 여기 내 결과입니다.

    Sending query: SELECT count(*) FROM daximation
    91
    Sending query: SELECT Auto_increment FROM information_schema.tables WHERE table_name='daximation'
    96
    Sending query: SHOW TABLE STATUS LIKE 'daximation'
    98
    Sending query: SELECT id FROM daximation ORDER BY id DESC LIMIT 1
    97
    

    여기에 스크린 샷입니다 : https://www.screencast.com/t/s8c3trYU

    여기 내 PHP 코드는 다음과 같습니다

    $query = "SELECT count(*) FROM daximation"; 
    $result = sendquery($query);
    $row = mysqli_fetch_row($result);
    debugprint( $row[0]);
    
    $query = "SELECT Auto_increment FROM information_schema.tables WHERE table_name='daximation'"; 
    $result = sendquery($query);
    $row = mysqli_fetch_row($result);
    debugprint( $row[0]);
    
    $query = "SHOW TABLE STATUS LIKE 'daximation'"; 
    $result = sendquery($query);
    $row = mysqli_fetch_row($result);
    debugprint( $row[10]);
    
    $query = "SELECT id FROM daximation ORDER BY id DESC LIMIT 1"; 
    $result = sendquery($query);
    $row = mysqli_fetch_row($result);
    debugprint( $row[0]);
    
  12. ==============================

    12.당신은 단지 사용자 등록의 마지막 삽입 된 ID로 열라는 사용자 및 UPDATE를 가진 별도의 테이블에 레코드 또는 무엇을 만들 수 없습니다?

    당신은 단지 사용자 등록의 마지막 삽입 된 ID로 열라는 사용자 및 UPDATE를 가진 별도의 테이블에 레코드 또는 무엇을 만들 수 없습니다?

    그럼 그냥 간단한 쿼리로이 필드를 확인합니다.

    그것은 거칠 수 있습니다하지만 그것은 완벽하게 작동합니다.

  13. from https://stackoverflow.com/questions/933565/most-efficient-way-to-get-table-row-count by cc-by-sa and MIT license