it-swarm.com.de

COUNT (id) vs. COUNT (*) in MySQL

Gibt es einen Unterschied zwischen den folgenden Abfragen, vorausgesetzt, die Tabelle enthält ein primäres Feld 'id' (wie bei der Geschwindigkeit usw.)?

SELECT COUNT(id) 
  FROM table

vs.

SELECT COUNT(*) 
  FROM table
19
James Simpson

Werfen Sie einen Blick auf Count (*) vs Count (col) unter www.mysqlperformanceblog.com. Sie diskutieren dieses Thema für verschiedene 'col'-Typen (NOT NULL oder nicht, mit Index usw.) und dies für MyISAM und InnoDB-Tabellen.

18
Pascal Thivent

Ich weiß, dass es sich bei der Frage um MySQL handelt, aber für das, was es wert ist, wird count (*) für Oracle empfohlen: Dies zeigt, dass dies datenbankspezifisch ist (siehe obigen Kommentar von BalusC). Da viele Datenbanken (MS-SQL, MySQL) Informationsschema-Tabellen enthalten, die verschiedene Arten von Metadaten enthalten, kann es zu Unterschieden kommen, wenn in einer Syntax lediglich ein sofort verfügbarer Wert gesucht wird und in einer anderen direkt die Tabelle aufgerufen wird . Am Ende des Tages: Probieren Sie verschiedene Optionen aus und sehen Sie, was EXPLAIN Ihnen hinter den Kulissen erzählt.

2
davek

COUNT (*) mit InnoDB ist langsamer als COUNT (ID), da InnoDB die Zeilenanzahl nicht zwischenspeichert.

Andererseits wäre mit MyISAM die Abfrage count (*) schneller und würde in kürzester Zeit zu einem Ergebnis führen, da MyISAM die Anzahl der Zeilen beibehält.

Es ist für MyISAM einfach, die Anzahl der Zeilen zu verwalten, da immer nur eine Transaktion ausgeführt wird, da MyISAM Sperren auf Tabellenebene ausführt. Nachdem eine Transaktion festgeschrieben wurde, ist es für MyISAM einfach, die Zeilenanzahl für eine Tabelle zu aktualisieren (unter Berücksichtigung der von der Transaktion vorgenommenen Einfügungen und Löschungen), bevor die nächste Transaktion beginnt.

Bei InnoDB, das Sperren auf Zeilenebene verwendet, werden jedoch mehrere Transaktionen gleichzeitig ausgeführt (und noch nicht festgeschrieben). Um die Konsistenz zu gewährleisten, muss für jede Transaktion die Tabelle (einschließlich der Anzahl der Zeilen in der Tabelle) ab dem Beginn der Transaktion sowie ihre eigenen Änderungen angezeigt werden. Daher ist die Anzahl der Zeilen in der Tabelle für jede gleichzeitige Transaktion möglicherweise unterschiedlich. Daher gibt es zu keinem Zeitpunkt eine "richtige" Gesamtanzahl von Zeilen (es sei denn, es werden keine Aktualisierungstransaktionen ausgeführt). Bei mehreren gleichzeitigen Transaktionen ist es nicht wirklich möglich, die Gesamtzahl der Zeilen in einer Tabelle zwischenzuspeichern.

1
Satakshi Pandey

Count (*) Count (Ename) Kann diff-Ausgaben anzeigen, da Ename keine Spalte mit der Einschränkung Not null ist und sicherlich einige Nullwerte aufweist, die nicht gezählt werden.

Ich hoffe es hilft..!

0
Guguzz