Eddie: Wann und wo machen Indexe Sinn?

Hallo allerseits,

ich wuerde in meiner MySQL-DB gerne ein paar Indexe über verschiedene Attribute setzen. Nur über welche?

Hier z.B.:
   'SELECT ... FROM myTable WHERE authorID = 5'
wuerde doch ein Index ueber authorID durchaus Sinn machen, richtig?

Hier hingegen:
   'SELECT ... FROM myTable WHERE authorID = 5 AND isTitle = 1 ORDER BY chapterID ASC'
bekomme ich mit "authorID = 5" eine Auswahl von vielleicht 20 Einträgen, die ich dann mit den anderen Bedingungen weiter filtere, bzw. ordne.
Macht es dann Sinn, hier auch Indexe zu legen (über isTitle und chapterID)?
isTitle ist boolean, wenn ich da einen Index drueberlege, ergibt das doch prinzipiell einen ziemlich breiten Baum mit der Tiefe 1, oder? Macht fuer mich nicht viel Sinn.

Also wann setze ich den Index?

Danke für eure Hilfe,
Eddie

--
Old men and far travelers may lie with authority.
  1. Hi,

    'SELECT ... FROM myTable WHERE authorID = 5'
    wuerde doch ein Index ueber authorID durchaus Sinn machen, richtig?

    ja macht durchaus sinn ;-)

    Index immer dann wenn logische strukturen zu sehen sind und du auch diese bei deinen Abfragen nutzt.

    Die Sachen aus dem zweiten beispiel sind nicht sinnvoll da du dann quasie auf gut glück die ganze table mit index besetzen kannst aber nicht weist ob mysql die wirklich nutzt, ausnahme du zwingst mysql dazu was nicht heist das es dir performance vorteile bringt.

    Ich persönlich nutze index für emailadressen in verbindung mit unique, weil ich auch emailadressen in meine select befehle integriere ...

    Oder indexe bei UIDs oder sowas, auf jendenfall sachen die deutlich wichtig sind, da sonst die ganze indexerei nichts bringt ;-)

    Du möchtest ja auch nicht ein Inhaltsverzeihnis mit allen möglichen hin und her haben und dich vorher entscheiden müssen welches du jetzt benutzt, sondern einfach eins das konkret zur info führt ;-)

    Viele Grüße

    Chris

  2. Hi,

    Hier hingegen:
       'SELECT ... FROM myTable WHERE authorID = 5 AND isTitle = 1 ORDER BY chapterID ASC'
    bekomme ich mit "authorID = 5" eine Auswahl von vielleicht 20 Einträgen, die ich dann mit den anderen Bedingungen weiter filtere, bzw. ordne.
    Macht es dann Sinn, hier auch Indexe zu legen (über isTitle und chapterID)?
    isTitle ist boolean, wenn ich da einen Index drueberlege, ergibt das doch prinzipiell einen ziemlich breiten Baum mit der Tiefe 1, oder? Macht fuer mich nicht viel Sinn.

    richtig - ein Index soll so schnell wie möglich so viel wie möglich einschränken. Während isTitle, chapterId im ersten Schritt nur auf rund 50% einschränkt (also nicht sehr selektiv ist), wird chapterId, isTitle in der gleichen Zeit auf ca. 20 Einträge reduzieren.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  3. Hello,

    indexe sind sinnvoll, wenn ordinale Größen gespeichert werden. Wie Du schon selber erkannt hast, ist ein Index auf logische Werte wenig sinnvoll.

    Außerdem sollte die Indexbreite auch nicht _zu_ groß werden, da er ja redundant abgespeichert wird und daher Platz benötigt.

    Darüber hinaus gilt die regel, dass ein Index die Zugriffszeit beim Lesen (Holen der Daten) verkürzt, beim Wegschreiben, Ändern und Löschen der Daten aber teilweise erheblich verlängert. Indexe sollten daher nur über Spalten (oder Kombinationen von Spalten) angelegt werden, die auch häufig als Filterkriterium genutzt werden.

    Ob der Zugriff über einen weichen Kombinationsschlüssel (der erst in der Abfrage aus einzelindexen zusammengesetzt wird) genauso optimiert wird, wie der über einen harten (der als eigener Index ständig mitgeführt wird) hängt von der Qualität des Optimizer der DB ab.

    Cheatah hat ja schon darauf hingewiesen, wie man ungefähr "zu Fuß" ermitteln kann, wie hoch der Nutzen ist. Eine Reduzierung von 100:1 pro Indexstufe ist noch nützlich, eine von 2:1 bestimmt nicht mehr.

    Daher kommt es bei manchen DBMS sogar auf die Reihenfolge der einsdchränkenden Argumente in einem Filterkriterium an.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. yo,

      Cheatah hat ja schon darauf hingewiesen, wie man ungefähr "zu Fuß" ermitteln kann, wie hoch der Nutzen ist. Eine Reduzierung von 100:1 pro Indexstufe ist noch nützlich, eine von 2:1 bestimmt nicht mehr.

      die faustregel sagt, wenn die ergebnistabelle 10% oder 10:1 der quelltabelle enthält, dann ist ein index schneller als zum beispiel ein fullscan. allerdings habe ich keine ahnung, was du mit index auf logische werte meinst.

      Ilja