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

Prestazioni CASE in MySQL?

Praticamente tutti le funzioni per riga avranno un impatto sulle prestazioni, l'unica vera domanda è:"L'impatto è abbastanza piccolo da non preoccuparsene?".

Questo è qualcosa che dovresti scoprire misurando piuttosto che indovinando. L'amministrazione del database è solo un'attività da impostare e dimenticare se né i tuoi dati né le tue query cambiano mai. In caso contrario, dovresti monitorare periodicamente le prestazioni per assicurarti che non si verifichino problemi.

Con "abbastanza piccolo" nei commenti sopra, intendo che probabilmente non devi preoccuparti dell'impatto sulle prestazioni di qualcosa come:

select * from friends where lowercase(lastname) = "smith"

se hai solo tre amici.

L'impatto di queste cose diventa più grave man mano che il tavolo aumenta di dimensioni. Ad esempio, se hai cento milioni di clienti e vuoi trovare tutti quelli che potrebbero essere legati al computer, non vorresti provare:

select name from customers where lowercase(name) like '%comp%'

È probabile che questo ti porti addosso i tuoi DBA come una tonnellata di mattoni.

Un modo in cui abbiamo risolto questo problema in passato è introdurre la ridondanza nei dati. Usando quel primo esempio, vorremmo aggiungere una colonna extra chiamata lowerlastname e compilalo con il valore minuscolo di lastname . Quindi indicizzalo a scopo di ricerca e il tuo select le dichiarazioni diventano incredibilmente veloci, come dovrebbero essere.

E cosa fa questo al nostro tanto amato 3NF, ti sento chiedere? La risposta è "non molto", se sai cosa stai facendo :-)

È possibile impostare il database in modo che questa nuova colonna venga popolata da un trigger di inserimento/aggiornamento, per mantenere la coerenza dei dati. È perfettamente accettabile violare 3NF per motivi di prestazioni, a condizione di comprendere e mitigare le conseguenze.

Allo stesso modo, quella seconda query potrebbe avere un trigger di inserimento/aggiornamento che ha popolato una nuova colonna indicizzata name_contains_comp ogni volta che veniva aggiornata o inserita una voce che conteneva il testo rilevante.

Poiché la maggior parte dei database viene letta molto più spesso di quanto non venga scritta, questo sposta il costo del calcolo sull'inserimento/aggiornamento, ammortizzandolo di fatto in tutte le operazioni selezionate. La query sarebbe quindi:

select name from customers where name_contains_comp = 'Y'

Ancora una volta, troverai la query incredibilmente veloce al minor costo di inserimenti e aggiornamenti leggermente più lenti.