Mailinglisten-Archive |
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