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

Ottimizzazione MySQL per REGEXP

Se devi usare lo stile regexp WHERE clausole, sarai sicuramente afflitto da problemi di query lente. Affinché la ricerca in stile regexp funzioni, MySQL deve confrontare ogni valore nella colonna del tuo nome con regexp. Inoltre, la tua query ha raddoppiato i problemi guardando anche la colonna del tuo nome utente.

Ciò significa che MySQL non può sfruttare alcun indice, ed è così che tutti i DBMS velocizzano le query su tabelle di grandi dimensioni.

Ci sono alcune cose che puoi provare. Tutti implicano il dire addio a REGEXP.

Uno è questo:

WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')

Se crei indici sulle colonne del tuo nome e nome utente, questo dovrebbe essere abbastanza veloce. Cercherà tutti i nomi/nomi utente che iniziano con 'jack'. AVVISO che

WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */

cercherà i nomi che terminano con 'jack' ma sarà lenta come la tua ricerca in stile regexp.

Un'altra cosa che puoi fare è capire perché la tua applicazione deve essere in grado di cercare parte di un nome o nome utente. Puoi eliminare questa funzione dalla tua applicazione o trovare un modo migliore per gestirla.

Possibili modi migliori:

  1. Chiedi ai tuoi utenti di suddividere i loro nomi nei campi nome e cognome e cercare separatamente.
  2. Crea una funzione "cerca in tutti gli utenti" separata che venga utilizzata solo quando un utente ne ha bisogno, riducendo così la frequenza della tua query in stile regexp lento.
  3. Dividi tu stesso i loro nomi in una tabella di parole-nome separata usando una sorta di programma di preelaborazione. Cerca nella tabella nome-parole senza regexp.
  4. Scopri come utilizzare la ricerca full-text di MySQL per questa funzione.

Tutto ciò comporta un po' di lavoro di programmazione.