web-dev-qa-db-ja.com

テーブルの行数を取得する最も効率的な方法

現在、600万行を超えるデータベースがあり、成長しています。現在、SELECT COUNT(id)FROM tableを実行しています。ユーザーに番号を表示するために、データベースが大きくなっているので、番号を表示できるようにする以外にこれらの行をすべて保存する必要はありません。データベース内のほとんどの行を消去できるように、表示するauto_increment値を選択する方法はありますか? LAST_INSERT_ID()を使用しても機能しないようです。

65
James Simpson

レコード(行)の数を取得するだけの場合は、以下を使用することをお勧めします。

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の場合)代わりに。

59
James Skidmore

以下は、テーブルの次の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';
88
Graham Swan

これを試して

このSQLを実行します。

SHOW TABLE STATUS LIKE '<tablename>'

フィールドAuto_incrementの値を取得します

29
Abhijit

誰も次のことを提案していない理由はわかりません。これは、SQLのみを使用してauto_increment値を取得します(PHPのmysql_fetch_array):

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
17
doitlikejustin

選択クエリを記述して直接最大数を取得すると、クエリが間違った値を与える可能性があります。例えばテーブルにレコードが5つあるため、増分IDが6になり、レコード5を削除すると、テーブルには最大IDのレコードが4つあります。この場合、次の増分IDとして5が取得されます。 mysqlの定義自体から情報を取得できることを主張します。 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]";
?>
2
Pankaj Khairnar

SELECT id FROM table ORDER BY id DESC LIMIT 1は、自動インクリメントIDではなく、最大IDを返すことができます。両方とも条件によって異なります

1
maniclorn

「ステータスの表示」の権限がない場合、最良のオプションは、2つのトリガーと、10億レコードのテーブルの行数を保持する新しいテーブルを作成することです。

例:

表A >>億レコード
TableB >> 1列と1行

TableA(InsertTrigger)に挿入クエリがあるたびに、行の値を1 TableBずつ増やします
TableA(DeleteTrigger)に削除クエリがあるたびに、TableBの行の値を1ずつ減らします

1
Sateesh D

コントローラー

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

[〜#〜] model [〜#〜]

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

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

役に立てば幸いです:)

0
23Pstars

Information_schemaの提案の隣に、これ:

SELECT id FROM table ORDER BY id DESC LIMIT 1

また、idフィールドにインデックスがある場合は、非常に高速である必要があります(auto_incrementを使用する必要があると思います)

0
Evert

これらの答えはどれもまったく正しくないようです。私はそれらをすべて試しました。ここに私の結果があります。

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/s8c3trY

ここに私の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]);
0
john ktejik