phpbar.de logo

Mailinglisten-Archive

[php] 1/2 OT - Anzahl ermitteln

[php] 1/2 OT - Anzahl ermitteln

Andreas Müller php at universalware.de
Mon Mai 23 21:51:03 CEST 2005


Hallo zusammen,
die beiden Abfragen also entweder

1. select count(*) from transactions group by tarif

2. select count(distinct tarif) from transactions

sehen vom Query-Plan her identisch aus, haben aber doch ein paar interne
Unterschiede.

Der Optimizer von MySQL erkennt nämlich beim 2. select nicht das hier eine
Aggregatfunktion folgt und daher die Art wie der distinct durchgeführt wird
irrelevant ist.

Bei der 1. Query kann MySQL unabhängig von einer weiteren Verarbeitung der
Reihe nach über den Index gehen und für jeden Wert die Anzahl ermitteln (die
sogar am Index-Key steht) und das Ergebnis auch direkt zurückliefern. Die
Laufzeit liegt hier eher am überspringen der Index-Einträge als an der
Zählarbeit. Auf konkrete Daten wird nicht zugegriffen und die Verarbeitung
findet fast ausschließlich im Index statt.

Bei der 2. Query muss MySQL zunächst ein temporäres Resultset erzeugen
welches die distincten Werte enthält und dieses Resultset dann über die
Aggregatfunktion jagen. Der Hauptaufwand besteht hier vor allem darin das
ein distinctes geordnetes Resultset erzeugt wird und scheinbar auch die
eigentlichen Daten für das Resultset aus der Datentabelle gelesen werden
müssen (also der konkrete Wert für den Tarif) und somit viel mehr Daten
angefasst werden als bei der 1. Query.

Ein paar Laufzeitwerte einer identischen Abfrage auf 16,5 Millionen
Datensätze mit dem Count-Ergebnis von 8216:

1. Query: 8,38 Sek.
2. Query: 17,00 Sek.

Gruß,
Andreas



php::bar PHP Wiki   -   Listenarchive