Wow! Det er den mest komplicerede "indeksfletning", jeg har set.
Normalt (måske altid ), kan du lave et 'sammensat' indeks for at erstatte et indeks-flet-kryds, og yde bedre . Skift key2 fra kun (pinned) til (pinned, DeviceId) . Dette kan slippe af med 'skæringspunktet' og fremskynde det.
Generelt bruger Optimizer kun indeksfletning i desperation. (Jeg tror, at dette er svaret på titelspørgsmålet.) Enhver mindre ændring af forespørgslen eller de involverede værdier, og Optimizer udfører forespørgslen uden indeksfletning.
En forbedring af den midlertidige tabel __codes er at bygge en permanent tabel med en lang række værdier, og brug derefter en række værdier fra den tabel inde i din Proc. Hvis du bruger MariaDB, så brug den dynamisk opbyggede "sekvens"-tabel. For eksempel 'tabellen' seq_1_to_100 er effektivt en tabel med én kolonne med tallene 1..100. Ingen grund til at erklære det eller udfylde det.
Du kan slippe af med den anden REPEAT sløjfe ved beregning tiden fra Code .
Undgå LOOPs vil være den største ydeevnefordel.
Få alt det gjort, så har jeg måske andre tips.