Mysql
 sql >> Database >  >> RDS >> Mysql

Mysql stesso interroga uno con index second senza ottenere 10000xFetch time?

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

ha 3 problemi di prestazioni:

  • OR è scarsamente ottimizzato. In sostanza, la tabella deve essere scansionata per controllare tutte le righe. È improbabile che gli indici aiutino.
  • UPPER(indexed-column) impedisce l'utilizzo di un indice su quella colonna. Questo è facilmente aggirabile dichiarando che quella colonna ha un COLLATION questo è "senza distinzione tra maiuscole e minuscole" -- cioè qualcosa come utf8_unicode_ci; nota il _ci .
  • LIKE '%... non è possibile utilizzare un indice a causa del principale carattere jolly.

Inoltre, di solito è sciocco avere

32497 row(s) returned

Cosa farai con così tante righe? Il tempo di trasferimento della rete sarà significativo, anche se la query stessa non lo è.

Per "risolvere" il LIKE , OR e UPPER problemi tutti in una volta, raccogliere il testo insieme in un'unica colonna in un'unica tabella. Quindi fornisci un FULLTEXT indice su quella colonna. Il, MATCH ... AGAINST ... funzionerà molto più velocemente, almeno per l'esecuzione di SomeName ricerca. (Il LEFT JOINs sono un'altra questione.)