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.