MySQL: Sortieren in Abfrage - irgendwelche Nebenwirkungen?

8

Meine OpenCart Tabellenkollation ist utf8_bin , leider kann ich nicht nach Produktnamen mit Akzent im Namen suchen. Ich habe auf Google gesucht und festgestellt, dass die Sortierung für die akzentkompatible und die Groß- und Kleinschreibung nicht relevante Suche utf8_general_ci sein muss.

Was passiert, wenn ich der Suchanfrage eine Sortiererklärung hinzufüge?

%Vor%

Hat es irgendwelche (schlechten) Nebenwirkungen? Ich habe Probleme mit Indexierung, Leistung? Oder ist es völlig sicher?

    
Adrian 28.04.2015, 21:55
quelle

4 Antworten

1

Ich fürchte, Sie müssen die Nebenwirkungen der Abfrageleistung berücksichtigen, insbesondere diejenigen, die Indizes verwenden. Hier ist ein einfacher Test:

%Vor%

Sie können sehen, dass MySQL den Index für a1 nicht mehr verwendet, wenn Sie es mit einer anderen Sortierung suchen, was für Sie ein großes Problem darstellen kann.

Um sicherzustellen, dass Ihre Indizes für Abfragen verwendet werden, müssen Sie möglicherweise die Spaltensortierung in die am häufigsten verwendete Spalte ändern.

    
Tim3880 09.06.2015 03:06
quelle
1

In Verwendung von COLLATE in SQL-Anweisungen finde ich nicht Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Wie auch immer, um deine Hauptfrage der Auswirkungen von Kollationen zu erklären, habe ich einige Tipps gefunden, aber zuerst:

Von dev.mysql.com :

  

Nonbinary-Zeichenfolgen (wie in den Datentypen CHAR , VARCHAR und TEXT gespeichert) haben einen Zeichensatz und eine Sortierung. Ein gegebener Zeichensatz kann mehrere Sortierfolgen haben, von denen jede eine bestimmte Sortierung und Vergleichsreihenfolge für die Zeichen in der Menge definiert.

  1. Die Sortierung ist nur die Reihenfolge, die für Zeichenfolgenvergleiche verwendet wird - sie hat (fast) nichts mit der Zeichencodierung zu tun, die für die Datenspeicherung verwendet wird. Ich sage fast, weil Kollatierungen nur mit bestimmten Zeichensätzen verwendet werden können, so dass die Änderung der Sortierung eine Änderung der Zeichencodierung erzwingen kann.
    In dem Maße, in dem die Zeichencodierung geändert wird, wird MySQL die Werte korrekt in den neuen Zeichensatz umkodieren, unabhängig davon, ob es sich um ein einzelnes Byte oder um ein Mehrfachbyte oder umgekehrt handelt. Beachten Sie, dass alle Werte, die für die Spalte zu groß werden, abgeschnitten werden. [1]
  2. Der praktische Vorteil der binären Sortierung ist ihre Geschwindigkeit, da der String-Vergleich sehr einfach / schnell ist. In der Regel liefern Indizes mit Binärdateien möglicherweise keine erwarteten Ergebnisse für die Sortierung, für genaue Übereinstimmungen können sie jedoch nützlich sein. [2]
  3. Bei mehreren Operanden kann es Mehrdeutigkeiten geben. Zum Beispiel:

    %Vor%

    Soll der Vergleich die Sortierung der Spalte x oder des Stringliterals 'Y' verwenden? Sowohl x als auch 'Y' haben Kollatierungen. Welche Kollatierung hat also Vorrang?
    Standard-SQL löst solche Fragen mit den sogenannten "coercibility" Regeln. [3]

  4. Wenn Sie die Sortierung eines Feldes ändern, kann ORDER BY - [auch in WHERE ] - INDEX ; daher könnte es überraschend ineffizient sein. [4]
  5. Da die erzwungene Sortierung über den gleichen Zeichensatz wie die Spaltencodierung definiert ist, hat dies keine Auswirkung auf die Leistung (im Gegensatz zur Definition dieser Sortierung als Standardvorgabe der Spalte; während utf8_general_ci bei Vergleichen schneller als% ausgeführt wird) co_de% aufgrund der zusätzlichen Lookups / Berechnung erforderlich).
    Wenn man jedoch eine Kollatierung erzwingt, die über einen anderen Zeichensatz definiert ist, müsste MySQL die Werte der Spalte transcodieren (was sich auf die Performance auswirkt). [5]
shA.t 08.06.2015 05:14
quelle
0

Wenn möglich, ändern Sie die Spaltendefinition (en).

%Vor%

(Sie sollten alles weitere einschließen, das bereits in der Spaltendefinition enthalten war.) Wenn Sie mehrere zu ändernde Spalten haben, führen Sie alle im selben ALTER (für Geschwindigkeit) aus.

Wenn Sie aus irgendeinem Grund ALTER nicht ausführen können, können Sie die SELECT anpassen, um die Sortierung zu ändern:

Die von Ihnen erwähnte SELECT hatte keine WHERE -Klausel zum Filtern, also lassen Sie mich den Testfall ändern:

Nehmen wir an, Sie haben das, was nur "San Jose" finden wird:

%Vor%

Um San José einzufügen:

%Vor%

Wenn Sie "Akzente kombinieren" haben, sollten Sie utf8_unicode_ci verwenden. Weitere Informationen zur Kombination von Diakritikern und Mehr zu Ihrem Thema .

Was Nebenwirkungen angeht? Keine außer bei potenziell großen: Der Index für die Spalte kann nicht verwendet werden. In meinem zweiten SELECT (oben) ist INDEX(city) nutzlos. Die ALTER vermeidet diese Leistungseinbuße für SELECT , aber die einmalige ALTER selbst ist teuer.

    
Rick James 09.06.2015 01:48
quelle
0

Dies könnte helfen: UTF-8: Allgemein? Behälter? Unicode? Bitte beachten Sie, dass utf8_bin ebenfalls zwischen Groß- und Kleinschreibung unterscheidet. Ich würde also die Tabellenkollation auf utf8_general_ci ändern und für die Zukunft sorgen.

    
MTP 10.06.2015 20:46
quelle

Tags und Links