現在、600 万行を超えるデータベースがあり、その数は増え続けています。私は現在 SELECT COUNT(id) FROM table; を行っています。数をユーザーに表示するためですが、データベースが大きくなり、数を表示できるようにすることを除いて、これらの行をすべて保存する必要はありません。データベース内のほとんどの行を消去できるように、表示する auto_increment 値を選択する方法はありますか? 使用LAST_INSERT_ID()
してもうまくいかないようです。
12 に答える
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';
レコード (行) の数を取得するだけの場合は、次を使用することをお勧めします。
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の場合)代わりに。
これを試して
次の 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 番目のレコードを削除すると、テーブルには 4 つのレコードがあり、最大 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つのトリガーと、10億レコードのテーブルの行数を保持する新しいテーブルを作成するのが最善の方法です。
例:
TableA>>Billionレコード
TableB>>1列と1行
TableA(InsertTrigger)に挿入クエリがある場合は常に、行の値を1つインクリメントし
ますTableB TableA(DeleteTrigger)に削除クエリがある場合は常に、TableBで行の値を1つデクリメントします
SELECT id FROM table ORDER BY id DESC LIMIT 1
自動インクリメント ID ではなく、最大 ID を返すことができます。どちらもいくつかの条件で異なります
$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 の場合に当てはまると思います)。
別のテーブルなどにレコードを作成して、ユーザーと呼ばれる列を作成し、ユーザー登録で最後に挿入された ID で更新することはできませんか?
次に、単純なクエリでこのフィールドを確認します。
ラフかもしれませんが、完璧に機能します。