Wow! To najbardziej skomplikowane „scalanie indeksów”, jakie widziałem.
Zwykle (może zawsze ), możesz utworzyć indeks „złożony”, aby zastąpić przecięcie scalania indeksów i i działać lepiej . Zmień key2
od tylko (pinned)
do (pinned, DeviceId)
. To może pozbądź się „skrzyżowania” i przyspiesz je.
Ogólnie rzecz biorąc, Optymalizator używa scalania indeksów tylko w desperacji. (Myślę, że to jest odpowiedź na pytanie tytułowe.) Wszelkie drobne zmiany w zapytaniu lub wartościach, których dotyczy, Optymalizator wykona zapytanie bez łączenia indeksów.
Ulepszenie tabeli tymczasowej __codes
jest zbudowanie stałej tabeli z dużym zakresem wartości, a następnie użycie zakresu wartości z tej tabeli w procedurze. Jeśli używasz MariaDB, użyj dynamicznie tworzonej tabeli „sekwencji”. Na przykład „tabela” seq_1_to_100
jest skutecznie tabela jednokolumnowa o numerach 1..100. Nie trzeba go deklarować ani wypełniać.
Możesz pozbyć się innych REPEAT
pętla przez obliczanie czas od Code
.
Unikanie LOOPs
będzie największą zaletą wydajności.
Zrób to wszystko, a potem mogę mieć inne wskazówki.