Mysql / MariaDB con lower() sugli indici da problemi di prestazioni
Per qualche giorno ho avuto problemi eseguendo alcune query con Join su una tabella contenente milioni di record. Le query bloccavano il server. Premetto che tutte le ricerche e i join erano su colonne indicizzate. Erano qualcosa tipo:
SELECT * FROM `61_traduzioni_frasi` AS `tf`
INNER JOIN `frasi` AS `f` ON f.id = tf.id_traduzione
INNER JOIN `lingue` AS `l` ON f.id_lingua = l.id
INNER JOIN `utenti` AS `u` ON f.id_utente = u.id
INNER JOIN `tipi_traduzione` AS `tt` ON tf.id_tipo_traduzione = tt.id
INNER JOIN `frasi` AS `f1` ON f1.id = tf.id_frase
INNER JOIN `lingue` AS `l1` ON f1.id_lingua = l1.id
INNER JOIN `utenti` AS `u1` ON f1.id_utente = u1.id
INNER JOIN `stati_moderazione` AS `sm` ON tf.id_stato_moderazione = sm.id WHERE (l.id = ‘1’ ) AND (l1.id = ‘2’ ) AND (LOWER(f1.testo) = ‘ciao’ ) AND (f.cancellato = ‘N’)
Allora ho provato a fare delle query con un semplice select per vedere come performava, del tipo:
SELECT * FROM frasi WHERE (LOWER(testo) = ‘ciao’ ) AND (f.cancellato = ‘N’);
Questa query non bloccava ma i tempi di esecuzione erano comunque alti a circa 12 secondi.
Cosi semplicemente rimuovende il lower() la query è scesa a 0.12 secondi.
La motivazione, da quanto letto, è che utilizzando lower() mysql/mariadb non utilizza gli indici.