現在、600万行を超えるデータベースがあり、成長しています。現在、SELECT COUNT(id)FROM tableを実行しています。ユーザーに番号を表示するために、データベースが大きくなっているので、番号を表示できるようにする以外にこれらの行をすべて保存する必要はありません。データベース内のほとんどの行を消去できるように、表示するauto_increment値を選択する方法はありますか? LAST_INSERT_ID()
を使用しても機能しないようです。
レコード(行)の数を取得するだけの場合は、以下を使用することをお勧めします。
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の場合)代わりに。
以下は、テーブルの次の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';
これを試して
このSQLを実行します。
SHOW TABLE STATUS LIKE '<tablename>'
フィールドAuto_increment
の値を取得します
誰も次のことを提案していない理由はわかりません。これは、SQLのみを使用してauto_increment値を取得します(PHPのmysql_fetch_array
):
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
選択クエリを記述して直接最大数を取得すると、クエリが間違った値を与える可能性があります。例えばテーブルにレコードが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]";
?>
SELECT id FROM table ORDER BY id DESC LIMIT 1
は、自動インクリメントIDではなく、最大IDを返すことができます。両方とも条件によって異なります
「ステータスの表示」の権限がない場合、最良のオプションは、2つのトリガーと、10億レコードのテーブルの行数を保持する新しいテーブルを作成することです。
例:
表A >>億レコード
TableB >> 1列と1行
TableA(InsertTrigger)に挿入クエリがあるたびに、行の値を1 TableBずつ増やします
TableA(DeleteTrigger)に削除クエリがあるたびに、TableBの行の値を1ずつ減らします
コントローラー
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
}
$next_id = mysql_fetch_assoc(mysql_query("SELECT MAX(id) FROM table"));
$next_id['MAX(id)']; // next auto incr id
役に立てば幸いです:)
Information_schemaの提案の隣に、これ:
SELECT id FROM table ORDER BY id DESC LIMIT 1
また、idフィールドにインデックスがある場合は、非常に高速である必要があります(auto_incrementを使用する必要があると思います)
これらの答えはどれもまったく正しくないようです。私はそれらをすべて試しました。ここに私の結果があります。
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]);