KartoffelKiffer Geschrieben 23. Januar 2008 Teilen Geschrieben 23. Januar 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 25. Januar 2008 Teilen Geschrieben 25. Januar 2008 Wie ich gelesen habe, sind es Hashwerte, die zur eindeutigen Identifizierung dienen. Mich würd interessieren wo Du das gelesen haben möchtest? Normale Indizes verwenden im allgemeinen einen ausbalancierten BTree (vereinfacht gesagt). Und das ist auch gut so, denn Hashwerte wären absoluter Unsinn. 2., 3. und 4. erledigen sich damit. Was ist, wenn ich ein Datumsfeld indiziere. Ein Datum wird in der Datenbank als interner binärer Wert gespeichert. Dieser hat nichts damit zu tun wie er angezeigt oder eingegeben wurde. Greift ein Index bei Anweisungen, die nicht dem "="-Operator entsprechen (wie z.B. <, >, <>, LIKE etc.)? Solange Du nicht LIKE '%xyz%' verwendest, ist es möglich, dass die DB einen vorhandenen Index verwendet. 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"? Das wäre sicherlich ein geeigneter Index. also auch explizit eine geringe (oder überhaupt nur eine) Menge ausgeben werden (die Menge, die dem Wert und dem Zeitraum entsprechen)? Versteh ich nicht ganz. Ein Index verändert niemals die Ergebnismenge. Er kann die Abfragedauer veringern. Ist es möglich tabellenübergreifend Indizes zu erstellen? Grundsätzlich kann ich hier nein sagen, auch wenn es Ausnahmen gibt wie z.B. den Bitmap Join Index ab Oracle 9i. Das ist allerdings wie gesagt eine datenbankabhängige Ausnahme (die es vielleicht auch bei anderen DBs gibt) allerdings sollte man genau wissen wann und warum man so einen Index einsetzt. Viel Text finde ich darüber leider nicht im Internet Ok ich nehme an, Du verwendest das Internet bereits seit einer Weile und bist recht zufrieden damit. Jetzt ist es Zeit ans Eingemachte zu gehen und eine Suchmaschiene zu verwenden: mysql index verwendung - Google-Suche Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.