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

Mysql fragt die gleiche Abfrage mit dem zweiten Index ab, ohne 10000xFetch-Zeit zu erhalten?

OR UPPER(lu.opis) LIKE UPPER('%SomeName%')

hat 3 Leistungsprobleme:

  • OR ist schlecht optimiert. Im Wesentlichen muss die Tabelle gescannt werden, um alle Zeilen zu überprüfen. Indizes sind wahrscheinlich nicht hilfreich.
  • UPPER(indexed-column) verhindert die Verwendung eines Indexes für diese Spalte. Dies kann leicht umgangen werden, indem diese Spalte als COLLATION deklariert wird das ist „Groß-/Kleinschreibung egal“ – also so etwas wie utf8_unicode_ci; beachten Sie das _ci .
  • LIKE '%... kann wegen des Führenden keinen Index verwenden Platzhalter.

Außerdem ist es normalerweise töricht, es zu haben

32497 row(s) returned

Was willst du mit so vielen Zeilen machen? Die Netzwerkübertragungszeit wird erheblich sein, auch wenn die Abfrage selbst dies nicht ist.

Um das LIKE zu "lösen". , OR , und UPPER Probleme auf einmal, sammeln Sie den Text in einer einzigen Spalte in einer einzigen Tabelle zusammen. Geben Sie dann einen FULLTEXT ein Index für diese Spalte. Das, MATCH ... AGAINST ... wird viel schneller laufen - zumindest für SomeName Suche. (Die LEFT JOINs sind eine andere Sache.)