Michael Schröpl: MYSQL-ABFRAGE SCHNELLER

Beitrag lesen

Hi Harry,

Wie stark projezieren diese?
magst Du mal schnell erklären, was das heißt?
Fände ich nämlich auch interessant :-)))

mit 'projezieren' meine ich das Verhältnis zwischen

  • der Anzahl Einträge der Tabelle und
  • der Anzahl Einträge pro Schlüsselwert.

Ein Primary Key projeziert optimal (n:1); ein Key kann aber auch beliebig viel schlechter projezieren.
Wäre beispielsweise das Forums-Archiv eine relationale Tabelle, dann würde etwa die Spalte 'topic' einige hunderttausend Beiträge in nur ca. 30 Gruppen unterteilen, also immer noch viele tausend Treffer pro Schlüsselwert liefern, die dann alle noch genauer untersucht werden müßten ... in diesem Falle würde sich ein Index über diese Spalte nicht lohnen.

Je mehr Treffer ein Schlüsselwert liefert, desto teurer ist es, den zusätzlichen Overhead des Zugriffs auf einen Indexbaum zu bezahlen, statt einfach linear über die ganze Tabelle zu laufen ("full table scan").
Es kann natürlich immer noch großartig sein - denn der Overhead ist konstanter Natur (ein Faktor zwischen 5 und 10 ist eine gute Näherung), während der Gewinn durch einen Indexzugriff logarithmischer Natur ist: Eine Tabelle mit 1000 Einträgen läßt sich durch einen binären Index-Baum mit Höhe 10 abbilden - bei der Suche nach einem bestimmten Wert wären hier also nicht im Erwartungswert 500 Vergleiche erforderlich (die Anzahl der Vergleiche ist gleichverteilt zwischen 1 und 999), sondern nur ca. 50-100 (die Nutzinformation des Baums steckt in den Blättern).

Das ist immerhin fünf- bis zehnmal so schnell wie ohne Index. Und deshalb lohnt es sich, seine Tabellen- und Indexstruktur den tatsächlich erforderlichen Queries sehr exakt anzupassen.

Viele Grüße
      Michael

--
T'Pol: I apologize if I acted inappropriately.
V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
(sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)