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

Perché MySQL non usa sempre l'unione degli indici qui?

Oh! Questa è la "unione di indici" più complicata che abbia mai visto.

Di solito (forse sempre ), puoi creare un indice "composito" per sostituire un indice-unione-intersezione, e prestazioni migliori . Cambia key2 da solo (pinned) a (pinned, DeviceId) . Questo può sbarazzati dell'"incrocio" e acceleralo.

In generale, l'Ottimizzatore utilizza l'unione degli indici solo per disperazione. (Penso che questa sia la risposta alla domanda del titolo.) Eventuali lievi modifiche alla query o ai valori coinvolti e l'ottimizzatore eseguirà la query senza l'unione degli indici.

Un miglioramento sulla tabella temporanea __codes è creare una tabella permanente con un ampio intervallo di valori, quindi utilizzare un intervallo di valori da quella tabella all'interno del tuo Proc. Se stai usando MariaDB, usa la tabella "sequenza" creata dinamicamente. Ad esempio la 'tabella' seq_1_to_100 è efficace una tabella di una colonna con i numeri 1..100. Non c'è bisogno di dichiararlo o popolarlo.

Puoi sbarazzarti dell'altro REPEAT loop calcolando l'ora da Code .

Evitare LOOPs sarà il più grande vantaggio in termini di prestazioni.

Fai tutto ciò, poi potrei avere altri suggerimenti.