MySQL: Sortieren in der Abfrage - Nebenwirkungen?
Meine OpenCart
Tabelle Sortierung ist utf8_bin
kann ich leider nicht, Suche nach Produkt-Namen mit Akzent in Ihrem Namen. Ich habe in Google gesucht und nur gefunden, dass die Sortierung muss utf8_general_ci
für die Akzent-kompatibel und groß-und Kleinschreibung suchen.
Was ist, Wenn ich hinzufügen, Sortieren die Erklärung zu der Suchanfrage?
SELECT *
FROM `address`
COLLATE utf8_general_ci
LIMIT 0 , 30
Gibt es irgendwelche (schlechten) Nebeneffekt? Ich red über Probleme mit der Indexierung, Leistung? Oder ist es Total sicher?
- Ich bezweifle, dass eine einfache select-Anweisung würde alle schlechten Nebenwirkungen (abgesehen von performance-Problemen mit der select-Anweisung, die Sie ausführen). Schließlich sind Sie nicht die änderung der Tabellendefinition.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich fürchte, Sie haben zu berücksichtigen, die Nebenwirkungen, die auf die query-performance, vor allem diejenigen, die mit Indizes. Hier ist ein einfacher test:
Können Sie sehen, dass MySQL stoppen mit dem index auf der a1, wenn Sie suchen, es mit einer anderen Sortierung, das kann ein großes problem für Sie.
Sicherstellen, dass Ihre Indizes sind für Abfragen können Sie eine änderung an der Spalte Sortierung auf die am häufigsten verwendete ein.
In mithilfe der COLLATE-in SQL-Anweisungen, ich finde nicht, dass die Nutzung, Jedenfalls für die Erklärung über Ihre zentrale Frage der Auswirkungen der Verwendung von Sortierungen fand ich einige Tipps, aber zuerst:
Vom dev.mysql.com:
Soweit die Zeichenkodierung geändert, MySQL korrekt re-Kodieren Sie die Werte zu den neuen Zeichensatz ob es von single-oder multi-byte-oder Umgekehrt. Beachten Sie, dass alle Werte, die zu groß für die Spalte abgeschnitten wird.[1]
Mit mehreren Operanden können, gibt es Mehrdeutigkeiten. Zum Beispiel:
Sollte der Vergleich die Sortierung der Spalte
x
oder das string-literal'Y'
? Beidex
und'Y'
Sortierungen haben, so dass die Sortierung Vorrang?SQL-Standard löst solche Fragen mit was verwendete, genannt zu werden "coercibility" Regeln. [3]
ORDER BY
-[auch inWHERE
]- keineINDEX
; daher könnte es sein, überraschend ineffizient. [4]utf8_general_ci
fast sicher langsamer im Vergleiche alsutf8_bin
durch die zusätzlichen Suchvorgänge/Berechnung erforderlich).Wenn man jedoch gezwungen, eine Sortierung definiert ist, über einen anderen Zeichensatz, MySQL müsste transcode die Spalte Werte (das würde eine Auswirkung auf die Leistung).[5]
Wenn möglich, ändern Sie die Spaltendefinition(en).
(Sie sollten etwas anderes, das war schon in der Spalte definition.) Wenn Sie mehrere Spalten zu ändern, gehen Sie alle im gleichen ALTER (für die Geschwindigkeit).
Wenn aus irgendeinem Grund Sie nicht tun kann, die
ALTER
, dann, ja, können Sie zwicken dieSELECT
um die Sortierung zu ändern:Den
SELECT
Sie erwähnt hatten keineWHERE
- Klausel für die Filterung, also lass mich ändern Sie den test-Fall:Lassen Sie uns sagen, Sie haben dieser, der nur 'San Jose':
Enthalten
San José
:Wenn Sie könnte "die Kombination von Akzenten", sollten Sie mit utf8_unicode_ci. Mehr über die Kombination von Diacriticals und Mehr zu Ihrem Thema.
Da für Nebenwirkungen? Keine, ausgenommen die auf potenziell große: der index für Die Spalte verwendet werden können. In meinem zweiten
SELECT
(oben)INDEX(city)
ist nutzlos. DieALTER
vermeidet diese Leistungseinbußen auf dieSELECT
, aber das one-timeALTER
selbst ist teuer.Dies könnte helfen: UTF-8: Allgemeine? Bin? Unicode?
Bitte beachten Sie, dass
utf8_bin
ist auch groß-und Kleinschreibung. Also ich würde für Veränderung Tabelle Sortierungutf8_general_ci
und Frieden des Verstandes für die Zukunft.