Announcement

Collapse
No announcement yet.

Ernsthafte Fragen zu MySQL und seiner Indizierung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ernsthafte Fragen zu MySQL und seiner Indizierung

    Hallo,

    ich nutze MySQL schon eine Weile, und bin auch sehr zufrieden damit. Jetzt geht es langsam ans Eingemachte, nämlich der MySQL und Indizierung von Spalten.

    Natürlich habe ich mich im Internet hinreichend informiert, nur bleiben einige Fragen dennoch offen. Ich stelle jetzt einfach mal eine Liste von Fragen auf, die mir im Kopf herumschwirren.

    1.) Die größte Frage überhaupt: Wie speichert MySQL seine Indizierung ab? Wie ich gelesen habe, sind es Hashwerte, die zur eindeutigen Identifizierung dienen.

    2.) Wie groß ist der Streuwert dieser Hashwerte?

    3.) Frage 2 hat einen Hintergedanken. Und zwar geht es um die Funktion "LIKE". Indiziere ich eine Spalte "Mitteilung", welche vom Typ VARCHAR ist und 255 Zeichen lang sein kann und darauf einen Index lege. Kreiere ich nun eine Anweisung 'SELECT Mitteilung FROM Mitteilungen WHERE Mitteilung LIKE "Irgendein Text%"', greift dann die Indizierung dennoch? Wenn ich mir einen Hashwert vorstelle, der 32 Zeichen lang ist, der Streuwert dieser Hashfunktion nun enorm ist, sodass wenn ein Bit anders gesetzt ist, der komplette Hash völlig different zum Vorgänger aussieht, so kann ich mir einen Vergleich nicht vorstellen.

    Man nehme MD5. Ich speichere "Dies ist ein Test" in MD5 ab, heraus kommt "6cddeb6a2f0582c82dee9a38e3f035d7". Suche ich nun nach "Dies ist%", also einer Zeichenkette "Dies ist" und darauffolgendem Text, der irrelevant ist, so erhalte ich "1759ed07e43fad6f7077d52482750252". Also einem völlig anderen Ergebnis, welches schier nicht verglichen werden kann.

    4.) Meine Vermutung lautet also, MySQL nutzt eigene, intelligente Hashfunktionen, die einen geringen Streuwert aufweisen, um so etwaige ähnliche, oder teilstring-behaftete Werte ausfindig zu machen (sofern ein Index auf ein Feld mittels LIKE überhaupt greift).

    5.) In eine ähnliche Richtung geht auch meine folgene Frage: Was ist, wenn ich ein Datumsfeld indiziere. Und ich alle Datensätze älter als 01-01-2007 haben möchte, also < 01-01-2007. Greift da ebenfalls die Indizierung? Es würde von einer Eingabe ein Hash gebildet werden (01-01-2007) und mit einer Anzahl n aus der Datenbank verglichen werden.

    6.) Global gesprochen: Greift ein Index bei Anweisungen, die nicht dem "="-Operator entsprechen (wie z.B. <, >, <>, LIKE etc.)?

    7.) Wenn ich eine Abfrage habe, mit mehreren WHERE-Bedingungen. Wäre es sinnvoll für diese (vielleicht eine signifikante) Abfrage einen eigenen Index zu erstellen? Als Beispiel, ich möchte einen Datensatz mit einem bestimmten Wert und einem bestimmten Zeitraum ermittelt haben (WHERE Wert="abcdefg" AND Time < NOW()), wäre es klug einen Index anzulegen, über die Spalten "Wert" und "Time"? So würde doch explizit eine Indizierung über die beiden Spalten erfolgen, also auch explizit eine geringe (oder überhaupt nur eine) Menge ausgeben werden (die Menge, die dem Wert und dem Zeitraum entsprechen)?

    8.) Ist es möglich tabellenübergreifend Indizes zu erstellen? Gesetz dem Fall, dass meine Behauptung, die in Punkt 7 gestellt wurde, wahr ist (also dass die Indizierung über mehrere Spalten für spezielle Abfragen Pluspunkte bringt), ich Indizes erstellen kann, die über Tabelle1.Spalte1, Tabelle1.Spalte2 und Tabelle2.Spalte1 gehen?

    Es tut mir leid, wenn das hier alles etwas viel erscheint. Aber das sind im Moment Punkte, die mir als Dorn im Auge erscheinen. Viel Text finde ich darüber leider nicht im Internet, weshalb ich noch etwas im Dunklen stehe.

    Ich hoffe es nimmt sich jemand meinen Fragen an.




    Mfg Tom

  • #2
    Also zu allererst MySQL hat verschiedene Storage Eingines und je nachdem welche Engine man benutzt kann das auch mit den Indexen anders sein.

    Außerdem hängt das auch noch von der MySQL Version ab.

    zu 3. da gibt es in MySQL >=5.0 eine Volltext Index der dafür echt geut geeignet ist.

    Comment


    • #3
      Hallo Tom,

      schonmal gelesen: How MySQL Uses Indexes?

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment

      Working...
      X