J'ai actuellement une base de données avec plus de 6 millions de lignes et en croissance. Je fais actuellement SELECT COUNT (id) FROM table; afin d'afficher le nombre à mes utilisateurs, mais la base de données grossit et je n'ai pas besoin de stocker toutes ces lignes, sauf pour pouvoir afficher le nombre. Existe-t-il un moyen de sélectionner la valeur auto_increment à afficher afin de pouvoir effacer la plupart des lignes de la base de données? Utiliser LAST_INSERT_ID()
ne semble pas fonctionner.
S'il ne s'agit que d'obtenir le nombre d'enregistrements (lignes), je suggère d'utiliser:
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
(au moins pour MySQL) à la place.
Voici le moyen le plus performant de trouver la prochaine valeur AUTO_INCREMENT
pour une table. Ceci est rapide, même sur des bases de données contenant des millions de tables, car il ne nécessite pas d'interroger la base de données information_schema
potentiellement volumineuse.
mysql> SHOW TABLE STATUS LIKE 'table_name';
// Look for the Auto_increment column
Toutefois, si vous devez récupérer cette valeur dans une requête, vous devez accéder à la base de données information_schema
.
SELECT `AUTO_INCREMENT`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND TABLE_NAME = 'TableName';
essaye ça
Exécutez ce SQL:
SHOW TABLE STATUS LIKE '<tablename>'
et récupérez la valeur du champ Auto_increment
Je ne sais pas pourquoi personne n'a suggéré ce qui suit. Cela donnera la valeur auto_increment en utilisant seulement SQL (inutile d'utiliser mysql_fetch_array
de PHP):
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE TABLE_NAME = 'table'
si vous obtenez directement le nombre max en écrivant une requête select, votre requête risque de donner une valeur erronée. par exemple. si votre table a 5 enregistrements, votre identifiant d'incrémentation sera 6 et si je supprime l'enregistrement n ° 5, votre table a 4 enregistrements avec un identifiant maximal égal à 4 dans ce cas, vous obtiendrez 5 comme identifiant d'incrémentation suivant. peut obtenir des informations de mysql defination elle-même. en écrivant le code suivant en 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
peut renvoyer l'identifiant maximal et non l'incrémentation automatique. les deux sont différents dans certaines conditions
Si vous ne disposez pas des privilèges pour "Afficher le statut", alors, La meilleure option consiste à créer deux déclencheurs et une nouvelle table qui conserve le nombre de lignes de votre table de milliards d'enregistrements.
Exemple:
TableA >> Milliards de disques
TableB >> 1 colonne et 1 ligne
Chaque fois qu'il existe une requête d'insertion sur TableA (InsertTrigger), incrémentez la valeur de la ligne de 1 TableB
Chaque fois qu'il existe une requête de suppression sur TableA (DeleteTrigger), décrémentez la valeur de la ligne de 1 dans TableB
Manette
SomeNameModel::_getNextID($this->$table)
MOD&EGRAVE;LE
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
j'espère que ça vous aidera :)
A côté de la suggestion de information_schema, ceci:
SELECT id FROM table ORDER BY id DESC LIMIT 1
devrait aussi être très rapide, à condition qu'il y ait un index sur le champ id (ce qui doit être le cas avec auto_increment)
Aucune de ces réponses ne semble avoir raison. Je les ai tous essayés. Voici mes résultats.
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
voici la capture d'écran: https://www.screencast.com/t/s8c3trYU
Voici mon code 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]);