it-swarm.com.de

Die effizienteste Methode, um die Anzahl der Tabellenzeilen zu ermitteln

Ich habe derzeit eine Datenbank mit über 6 Millionen Zeilen und wächst. Ich verwende zurzeit SELECT COUNT (id) FROM Tabelle; Um die Anzahl für meine Benutzer anzuzeigen, wird die Datenbank jedoch groß und ich muss nicht alle diese Zeilen speichern, außer, um die Anzahl anzeigen zu können. Gibt es eine Möglichkeit, den auto_increment-Wert zur Anzeige auszuwählen, damit ich die meisten Zeilen in der Datenbank löschen kann? Die Verwendung von LAST_INSERT_ID() scheint nicht zu funktionieren.

63
James Simpson

Wenn es nur um die Anzahl der Datensätze (Zeilen) geht, würde ich Folgendes vorschlagen

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

(zumindest für MySQL) stattdessen.

59
James Skidmore

Im Folgenden finden Sie die performanteste Methode, um den nächsten AUTO_INCREMENT-Wert für eine Tabelle zu finden. Dies ist selbst für Datenbanken mit Millionen von Tabellen schnell, da keine Abfrage der möglicherweise großen information_schema-Datenbank erforderlich ist.

mysql> SHOW TABLE STATUS LIKE 'table_name';
// Look for the Auto_increment column

Wenn Sie diesen Wert jedoch in einer Abfrage abrufen müssen, müssen Sie zur Datenbank information_schema gehen.

SELECT `AUTO_INCREMENT`
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_SCHEMA = 'DatabaseName'
AND    TABLE_NAME   = 'TableName';
87
Graham Swan

versuche dies

Führen Sie diese SQL aus:

SHOW TABLE STATUS LIKE '<tablename>'

und holen Sie den Wert des Feldes Auto_increment

29
Abhijit

Ich bin nicht sicher, warum niemand folgendes vorgeschlagen hat. Dadurch wird der auto_increment-Wert nur mit SQL abgerufen (keine Verwendung von PHP mysql_fetch_array):

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

wenn Sie direkt durch Eingabe der Auswahlabfrage die maximale Anzahl erhalten, besteht die Möglichkeit, dass Ihre Abfrage einen falschen Wert ergibt. z.B. Wenn Ihre Tabelle 5 Datensätze enthält, ist Ihre Inkrement-ID 6 und wenn ich Datensatz Nr. 5 lösche, hat Ihre Tabelle 4 Datensätze mit maximaler ID. In diesem Fall erhalten Sie 5 als nächste Inkrement-ID kann Informationen von MySQL-Definition selbst erhalten. indem Sie folgenden Code in PHP schreiben

<?
$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 kann die maximale ID und nicht die automatische Inkrement-ID zurückgeben. beide sind in einigen Bedingungen unterschiedlich

1
maniclorn

Wenn Sie nicht über die Berechtigung "Status anzeigen" verfügen, verwenden Sie Die beste Option ist, zwei Trigger und eine neue Tabelle zu erstellen, die die Zeilenanzahl Ihrer Milliarden-Datensatztabelle enthält. 

Beispiel:

TableA >> Milliarden Datensätze
TableB >> 1 Spalte und 1 Zeile

Erhöhen Sie den Zeilenwert um 1 TableB, wenn eine Abfrage für TabelleA (InsertTrigger) eingefügt wird
Wenn eine Abfrage zum Löschen in TableA (DeleteTrigger) vorliegt, verringern Sie den Zeilenwert in TableB um 1

1
Sateesh D

Controller

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

hoffe es hilfreich :)

0
23Pstars

Neben dem Vorschlag von information_schema:

SELECT id FROM table ORDER BY id DESC LIMIT 1

sollte auch sehr schnell sein, vorausgesetzt es gibt einen Index auf dem ID-Feld (was meiner Meinung nach bei auto_increment der Fall sein muss)

0
Evert

Keine dieser Antworten scheint richtig zu sein. Ich habe sie alle ausprobiert. Hier sind meine Ergebnisse. 

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

hier ist der Screenshot: https://www.screencast.com/t/s8c3trYU

Hier ist mein PHP Code:

$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