web-dev-qa-db-fra.com

Le moyen le plus efficace d'obtenir le nombre de lignes de la table

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.

63
James Simpson

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.

59
James Skidmore

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';
87
Graham Swan

essaye ça

Exécutez ce SQL:

SHOW TABLE STATUS LIKE '<tablename>'

et récupérez la valeur du champ Auto_increment

29
Abhijit

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'
16
doitlikejustin

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]";
?>
2
Pankaj Khairnar

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

1
maniclorn

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

1
Sateesh D

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

}
0
$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 :)

0
23Pstars

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)

0
Evert

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]);
0
john ktejik