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.