Sie sind hier : sebastian1012.bplaced.net/ homepage-neu / kreuz-und-quer / tutorials-info-neuigkeiten-datenbank / analysieren-fuer-die-statistiken.php

Analysieren für die Statistiken

Auch wenn der Titel etwas sehr nach Matheunterricht oder Studium klingt, birgt sich dahinter eine wichtige, praxisrelevante Vorgehensweise, um den Zugriff auf MySQL-Tabellen zu beschleunigen. Fakt ist, dass MySQL nur einen Index benutzen wird, wenn die Anzahl der zurückgegebenen Datensätze kleiner als etwa 10 % der Gesamtanzahl der Datensätze der Tabelle ist. Ist das nicht der Fall ist ein Full Table Scan oft schneller. Der Full Table Scan ist recht langsam. Er kann aber vermieden werden, wenn man dem DBMS Auskunft darüber gibt, wie die Daten verteilt sind.

Das Problem, vor dem das DBMS steht, ist zu entscheiden, ob ein Index oder ein Full Table Scan schneller sein wird. Es muss sozusagen in die Zukunft schauen. Um das nicht zum Glücksspiel verkommen zu lassen, wird die Abfrage analysiert und darauf basierend eine Entscheidung getroffen. Das kann allerdings nur richtig funktionieren, wenn MySQL genug Statistiken über die Tabelle vorliegen.

Ich möchte es am Beispiel erklären. Wir haben eine Tabelle mit einem Feld vom Typ ENUM, das zwei Werte aufnehmen kann: ENUM(‚ja‘,’nein‘). In unserer Tabelle befinden sich 10.000 Datensätze, davon 100 mit ‚ja‘ und 9900 mit ’nein‘. Wir wollen nun alle Datensätze haben, die ‚ja‘ als Wert eingetragen haben:

SELECT * FROM tabelle WHERE enumspalte='ja'

Wenn MySQL nichts weiter über die Tabellenspalte weiß, außer dass sie 2 mögliche Werte hat, wird eine Gleichverteilung der Werte angenommen (50% ja, 50% nein). Und genau da liegt das Problem: Nun „denkt“ MySQL, dass mehr als die besagten ca. 10 % (der Wert kann etwas abweichen) der Datensätze zurückgeliefert werden sollen, und zwar 50% von 10.000 = 5000. Deshalb wird es den Full Table Scan nutzen. Selbst wenn ein Index auf der Spalte liegt, wird dieser nicht genutzt.

Das Geheimnis liegt darin, MySQL mitzuteilen, wie die Werte verteilt sind. Das geschieht über

ANALYZE TABLE tabelle

Durch diesen Befehl „merkt“ sich MySQL, dass nur 1 % der Datensätze den Wert ‚ja‘ haben und wird daraus folgend für die Abfrage den Index benutzen.

Es sollte also regelmäßig ein Analysieren der Tabellen erfolgen. Und das vor allem mit Realdaten, denn es hilft nichts, wenn man zu Beginn mal eben die Tabelle analysiert, wo 10 Einträge drin sind. Dann kann nämlich eine völlig falsche Verteilung vorliegen, die erst später mit einer Vielzahl von neuen Datensätzen angeglichen wird. Wenn MySQL dann nichts von der neuen Verteilung weiß, kann es passieren, dass der Index sogar dann benutzt würde, wenn der Full Table Scan wesentlich schneller wäre.