Wie soll denn der Datenbankserver die Anzahl der Datensätze ermitteln, ohne die Tabelle bzw. den Index komplett zu durchlaufen?
Bei Verwendung des
SQL-Befehls
Count muß er das gewiß.
Nehmen wir ein stinknormales RDBMS. Tabellen und B-Tree Index (ist am gebräuchlichsten).
Dann haben wir 3 Fälle, wie ein 'COUNT(*) WHERE field = :foo' ermittelt wird.
- Index auf 'field' vorhanden. Die Einträge sind sortiert vorhanden im Index. Das RDBMS findet den 1.Eintrag der WHERE - Bedingung. Da es sich um eine Äquivalenz ('=') handelt, zählt man einfach die Einträge 'rechts' vom gefundenen Eintrag, die gleich sind ('Index-Seek').
- Anderer Index vorhanden, der 'field' enthält. Das RDBMS liest den Index ein, was wesentlich schneller geht und rennt sequentiell durch, um alle Records mit der Bedingung zu finden. ('Index Scan').
- Kein Index vorhanden. Das RDBMS muss die gesamte Tabelle durchlaufen ('Table Scan').
In jedem der drei Fälle gibt es noch Optimierungsmöglichkeiten, je nach Feld- und Indegröße sowie WHERE-Bedingung. Ist die Tabelle sehr klein, kann ein Table-Scan schneller sein, als eine Index-Suche, das entscheidet der Optimizer.
mySQL kennt andere Indexstrukturen, die sich sicherlich für den einen oder anderen Fall besser eignen, aber im Groben wird selbst SQLite das so handhaben, wie beschrieben. Das ist ja banale Algorithmik.