Tobi: Mysql: Funktionsweise bei =

Hi,

könnt ihr mir bitte verraten, wie mysql Strings vergleicht.
Habe ein Feld mit unique Inhalten. Dieses wird sehr häufig mit WHERE dieses_feld="anfrage_string" abgefragt.
Nun ändert sich momentan etwas an den Daten sodass für dieses_feld nicht mehr 255 Zeichen ausreichen. Demnach bin ich gezwungen Inkompatibilitäten in Kauf zu nehmen und dank Mysql5 die Größe auf 900 zu erweitern.
Oder ich müsste einen anderen Feld-Typ wählen.
Nun weiß ich jedoch nicht, ob es die Performance negativ beeinflusst, wenn ich z.B. TEXT statt VARCHAR verwende. Oder würde ein Index dem Ganzen Abhilfe schaffen?
Die andere Frage ist, ob ein Index nötig ist oder ob bei einem WHERE ...=... ohnehin etwas mit md5 vergleichbares verwendet wird zum Vergleich oder ob wirklich Char für Char verglichen wird, was wohl länger dauern würde bei einem längeren Feld.

Was würdet ihr mir raten?

Danke

  1. Moin!

    könnt ihr mir bitte verraten, wie mysql Strings vergleicht.

    Genauso, wie jedes andere System, dass Strings vergleicht: Zeichen für Zeichen. Das ist deswegen relativ performant, weil ja sofort bei Abweichungen ein Ergebnis (ungleich, kleiner/größer) ausgegeben werden kann, und nur bei absoluter Identität die gesamten Zeichen durchgegangen werden müssen. Was sich allerdings ja auch darauf beschränkt, maximal soviele Vergleiche durchzuführen, wie der kleinere der zu vergleichenden Strings lang ist.

    MySQL hat allerdings aufgrund der Implementation von Unicode-Zeichenfähigkeit einen etwas komplexeren Algorithmus zu absolvieren, da in Unicode unterschiedliche Zeichen durchaus als lexikalisch identisch definiert werden können (siehe Collation).

    Habe ein Feld mit unique Inhalten. Dieses wird sehr häufig mit WHERE dieses_feld="anfrage_string" abgefragt.
    Nun ändert sich momentan etwas an den Daten sodass für dieses_feld nicht mehr 255 Zeichen ausreichen. Demnach bin ich gezwungen Inkompatibilitäten in Kauf zu nehmen und dank Mysql5 die Größe auf 900 zu erweitern.
    Oder ich müsste einen anderen Feld-Typ wählen.
    Nun weiß ich jedoch nicht, ob es die Performance negativ beeinflusst, wenn ich z.B. TEXT statt VARCHAR verwende. Oder würde ein Index dem Ganzen Abhilfe schaffen?

    TEXT und Konsorten bieten nur eingeschränkte Möglichkeiten der Indizierung, konsultiere dazu am Besten das Handbuch. Ein Volltext-Index hilft dir ja kaum weiter, weil der kein UNIQUE-Constraint forciert.

    Wenn allerdings die Texte sowieso unique sind, frage ich mich, warum du den Zugriff über die Texte regelst, und nicht über eine ihnen äquivalente ID.

    Die andere Frage ist, ob ein Index nötig ist oder ob bei einem WHERE ...=... ohnehin etwas mit md5 vergleichbares verwendet wird zum Vergleich oder ob wirklich Char für Char verglichen wird, was wohl länger dauern würde bei einem längeren Feld.

    Ein Index ist ja allein deswegen notwendig, damit die Spalte unique bleibt.

    Was würdet ihr mir raten?

    Ich würde von der Abfrage der Textspalte wegkommen wollen. Und zwar so schnell, wie's geht. Wenn es einen Grund gibt, Textinhalte unique zu machen, dann ist im allgemeinen Fall irgendwas faul im DB-Design. Es sei denn, du hast spezielle Anforderungen, die du bislang noch nicht mitgeteilt hast.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."