INDEXies bei MySQL
Dachdeckermeister
- datenbank
Welche Eigenschaften sollten indizierte Spalten einer MySQL nach Möglichkeit aufweisen? Was ist hier im allgemeinen sinnvoll?
Danke im Voraus,
Markus
Hello,
Welche Eigenschaften sollten indizierte Spalten einer MySQL nach Möglichkeit aufweisen? Was ist hier im allgemeinen sinnvoll?
Sie sollten bereits nach wenigen Zeichen Eineindeutigkeit aufweisen, sodass es nicht notwendig wird, breite Indexe zu bauen. Das kostet nämlich Speicherplatz und viel Performance bei der Verwaltung des Index-Baumes. Außerdem sollten sie möglichst balanciert[tm] sein, dass heißt, nicht zuviele Werte (Häufungspunkte) in einer schmalen Untermenge des Index haben.
Ein guter Index zeichnet sich also durch eine hohe Auszeichnungsgüte und eine gleichmäßige Vertilung aus.
Liebe Grüße aus http://www.braunschweig.de
Tom
Moin!
Welche Eigenschaften sollten indizierte Spalten einer MySQL nach Möglichkeit aufweisen? Was ist hier im allgemeinen sinnvoll?
Sie sollten bereits nach wenigen Zeichen Eineindeutigkeit aufweisen, sodass es nicht notwendig wird, breite Indexe zu bauen. Das kostet nämlich Speicherplatz und viel Performance bei der Verwaltung des Index-Baumes. Außerdem sollten sie möglichst balanciert[tm] sein, dass heißt, nicht zuviele Werte (Häufungspunkte) in einer schmalen Untermenge des Index haben.
Ich widerspreche.
Wenn es um die Fragestellung "Welche Eigenschaften sollten indizierte Spalten haben?" geht, dann lautet meine Antwort: "Egal".
Man kann sich seine Daten ja nicht aussuchen. Wenn es in einer Telefonliste hundert "Meier" gibt, dann ist das so. Und den Namen kann man eben nur als CHAR, VARCHAR oder TEXT/BLOB speichern - mehr Auswahl gibt es nicht.
Um die Verwaltung des Index hat sich die Datenbank zu kümmern.
Entscheidend ist: Index ja oder nein? Eine Spalte, die immer nur so mitgeschleppt wird, aber niemals (bzw. sehr selten) zur Selektion von Datensätzen herangezogen wird, muß nicht indiziert werden, weil das unnötigen Aufwand bedeutet. Hingegen wird eine Spalte wie der Name mit Sicherheit indiziert sein, weil man eben sehr häufig nach Namen suchen wird.
Ein guter Index zeichnet sich also durch eine hohe Auszeichnungsgüte und eine gleichmäßige Vertilung aus.
Das ist für die Programmierer der Datenbank interessant, nicht für die Nutzer derselben.
- Sven Rautenberg
Hello,
Ich widerspreche.
Wenn es um die Fragestellung "Welche Eigenschaften sollten indizierte Spalten haben?" geht, dann lautet meine Antwort: "Egal".
Nein, wenn es um "ideale Eigenschaften" für einen Index geht, dann ist das nicht egal. Eine Spalte, die nur JA oder NEIN Werte enthält, wird man nicht indizieren. Da würden sich mir die ....haare sträuben.
Diese Spalte müsste man erst durch Hinzufügen eines weiteren wertigen Unterscheidungsmerkmales zur Indexfähigkeit bringen.
Man kann sich seine Daten ja nicht aussuchen.
eben darum sollte man für die Wahl eines Index VORHER überlegen, was für Daten denn da kommen könnten und was der Worts Case wäre. Ein "unbalanced index"[tm] macht jede Performance kaputt. Google mal danach...
Wenn es in einer Telefonliste hundert "Meier" gibt, dann ist das so.
Und dann muss man für den Index Sorge tragen, dass man auch die Duplicates noch unterscheiden kann.
Und den Namen kann man eben nur als CHAR, VARCHAR oder TEXT/BLOB speichern - mehr Auswahl gibt es nicht.
Oh, du willst uns hier etwas suggerieren.... Den INDEX kann man aber sehr wohl auch über zwei Spalten und mehr eröffnen. Für die Namen wären das dann z.B. "Nachname, Vorname, Geburtsdatum". Allerdings kennt ein normales aber gutes DBMS auch NEAR als Option bei der Indexsuche.
Um die Verwaltung des Index hat sich die Datenbank zu kümmern.
Und um die Definition der Programmierer!
Ein guter Index zeichnet sich also durch eine hohe Auszeichnungsgüte und eine gleichmäßige Vertilung aus.
Das ist für die Programmierer der Datenbank interessant, nicht für die Nutzer derselben.
Genau das war die Frage. Wie hat der Programmierer den Index anzulegen?
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo,
also ich schließe mich da vom "Anwendungs-PROGRAMMIERER"-Standpunkt Tom an. Wie die Datenbank den Index schön ausbalanciert hat den Entwickler der Datenbank zu interessieren, nicht aber den Entwickler AUF der Datenbank.
Der Index ist eine Methode zur Beschleunigung des Datenbankzugriffs, wie sinnvoll oder nicht sinnvoll die Indizierung von Ja/Nein-Werten ist mag eine Frage sein, nichts desto trotz ist es in einem bestimmten Kontext durchaus auch sinnvoll Spalten mit redundanten Inhalten zu indizieren. Das Beispiel mit dem Telefonbuch finde ich schon sehr passend:
Natürlich hast du recht, wenn ich 10 Leute Namens "Hans Meier" habe, dann ist ein Index darauf erst einmal sinnlos, die Suche würde alle Datensätze zurückgeben, erst über Einbeziehen der Telefonnummer kann ich die Sätze unterscheidbar machen. Aber jetzt nehmen wir mal die Anwendung, die auf dieser Datenbank (das gesamte Telefonbuch) arbeitet: Die wird doch in 99,99% aller Fälle einfach die Telefonnummer nicht kennen, mit ein Wenig Glück gibt der Mensch zwar noch den Vornamen ein, aber unter Umständen gibt er sogar nur den Namen an:
SELECT name, vorname, telefonnummer FROM telefonbuch
WHERE name = 'Meier'
ORDER BY name, vorname
Was würde man jetzt hier mit dem Index machen? 1,5er-lei:
Was ich in diesem Bereich gelernt und in der Praxis bisher erfahren habe ist, dass man Indizes auf Spalten braucht auf denen man häufig lesend (sortierend) mit den Datensätzen arbeitet. Und damit gibt es zunächst mal kein Kriterium von der Datenbank um eine Spalte zu indizieren, sondern nur Kriterien von der Anwendungsseite.
Meine Meinung, Hugh, ich habe gesprochen ;-)
MfG
Rouven
Ups,
also ich schließe mich da vom "Anwendungs-PROGRAMMIERER"-Standpunkt Tom an.
îch meinte Sven, sorry!
MfG
Rouven
Hello,
Hi!
Welche Eigenschaften sollten indizierte Spalten einer MySQL nach Möglichkeit aufweisen? Was ist hier im allgemeinen sinnvoll?
Sie sollten bereits nach wenigen Zeichen Eineindeutigkeit aufweisen, sodass es nicht notwendig wird, breite Indexe zu bauen. Das kostet nämlich Speicherplatz und viel Performance bei der Verwaltung des Index-Baumes. Außerdem sollten sie möglichst balanciert[tm] sein, dass heißt, nicht zuviele Werte (Häufungspunkte) in einer schmalen Untermenge des Index haben.
Heißt also soviel wie:
Ich lagere in einer Tabelle z.b. Vornamen, Nachnamen & Telefonnummern ab, erstelle über die Zelle 'Vornamen' einen index, da die ja sehr eindeutig sind, sich aber trotzdem effektiv voneinander unterscheiden aber auch mehrfach vorkommen können. Bestimmte namen wie z.B. 'Thomas' würden sicher relativ oft 'Magnus' jedoch eher weniger oft.
Hab ich das so richtig verstanden?
Ein guter Index zeichnet sich also durch eine hohe Auszeichnungsgüte und eine gleichmäßige Vertilung aus.
Liebe Grüße aus http://www.braunschweig.de
Tom
mfG Markus