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

MySQL select scheint sehr langsam zu sein, kann sich aber nicht vorstellen, wie man es verbessern kann?

Ich denke, es gibt einige Probleme mit der Abfrage und der Tabellendefinition selbst.

  • Table.name ist eine 4K-Zeichenspalte
  • Die Abfrage sortiert nach dieser Spalte

Sie sortieren basierend auf einer Spalte, in der Sie Zeichenfolgen speichern. Um nach Zeichenketten zu sortieren, müssen Zeichenkettenvergleiche durchgeführt werden. Der String-Vergleich ist in der Regel ein langsamer Vorgang und führt angesichts der Größe der verwendeten Spalte sehr wahrscheinlich zu einer merklichen Leistungseinbuße.

Wir haben keinen Hinweis auf den Inhalt Ihres name Spalte und es scheint schwierig zu sein, sich einen tatsächlichen Namen vorzustellen, der das erfordern würde viele Zeichen.

Wenn diese Zeichenfolge mehrere Datenteile enthält, die konzeptionell unterschiedlich sind, sollte die Spalte nach Möglichkeit in mehrere separate Spalten aufgeteilt und dann entsprechend normalisiert werden.

Wenn Sie den Inhalt dieser Spalte in mehrere kleinere aufteilen und diese dann verwenden könnten, wären die Zeichenfolgenvergleiche zwar immer noch teuer, aber „schneller“, da die verglichenen Zeichenfolgen erheblich kürzer sind als jetzt.

Eine andere zu berücksichtigende Sache ist, ob Sie die Suche durch Vermeiden optimieren können String-Vergleiche insgesamt oder durch Vermeiden von Abfragen, die trotz der Tatsache, dass Sie Indizes definiert haben, einen vollständigen Tabellenscan verursachen.

Dazu sollten Sie sich die Verwendung von explain ansehen mit Ihrer Anfrage, damit Sie die Abfrageausführungsplan

Zitieren der Dokumente (meine Hervorhebung):

Bearbeiten 1

Sie haben klargestellt, dass Ihr name Spalte ist eigentlich für Benutzernotizen. In diesem Fall denke ich, dass Sie Folgendes beachten sollten (zusätzlich zu dem, was bereits erwähnt wurde):

  1. Benennen Sie die Spalte in etwas um, das ihrem tatsächlichen Inhalt entspricht
  2. Entfernen Sie den Index aus der Spalte
  3. Tun Sie nicht Verwenden Sie diese Spalte zum Suchen, Sortieren oder für andere Vorgänge, außer sie nur auszuwählen, um sie anzuzeigen (Es wäre sehr selten, wenn es für etwas anderes verwendet werden musste, IMHO.)
  4. Erwägen Sie optional, die Spalte in einen text zu ändern eingeben und Sie müssen sich nicht mehr so ​​viele Gedanken über Benutzer-Aufsätze machen ohne Warnung abgeschnitten werden (es sei denn, die GUI hat dem Benutzer die gleiche Eingabelängenbeschränkung auferlegt)