Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum ist die Leistung von MySQL-Abfragen bei Verwendung eines CHAR/VARCHAR-Index so schlecht?

Das Problem besteht eindeutig darin, dass die Abfrage einen Indexscan durchführt. Der alternative Ansatz wäre, zwei Indexsuchen durchzuführen, für den ersten und den letzten Wert, die gleich sind, und dann Metainformationen im Index für die Berechnung zu verwenden. Ihren Beobachtungen zufolge macht MySQL beides.

Der Rest dieser Antwort ist Spekulation.

Der Grund dafür, dass die Leistung „nur“ 300-mal langsamer ist, anstatt 200.000-mal langsamer, liegt am Overhead beim Lesen des Index. Tatsächlich ist das Scannen der Einträge ziemlich schnell im Vergleich zu anderen erforderlichen Operationen.

Es gibt einen grundlegenden Unterschied zwischen Zahlen und Zeichenketten, wenn es um Vergleiche geht. Die Engine kann sich einfach die Bitdarstellungen zweier Zahlen ansehen und erkennen, ob sie gleich oder unterschiedlich sind. Leider müssen Sie für Zeichenfolgen die Codierung/Sortierung berücksichtigen. Ich denke, deshalb muss man sich die Werte ansehen.

Es ist möglich, dass Sie bei 216.000 Exemplaren genau die gleiche Zeichenfolge, dann wäre MySQL in der Lage, die Zählung mithilfe von Metadaten im Index durchzuführen. Mit anderen Worten, der Indexer ist intelligent genug, um Metadaten für exakte Gleichheitsvergleiche zu verwenden. Aber es ist nicht intelligent genug, um die Codierung zu berücksichtigen.