Wow! Das ist die komplizierteste "Indexzusammenführung", die ich je gesehen habe.
Normalerweise (vielleicht immer ), können Sie einen "zusammengesetzten" Index erstellen, um einen Index-Merge-Intersect zu ersetzen, und eine bessere Leistung erbringen . Ändere key2
von nur (pinned)
zu (pinned, DeviceId)
. Dies kann Beseitigen Sie die 'Schnittmenge' und beschleunigen Sie sie.
Im Allgemeinen verwendet der Optimierer die Indexzusammenführung nur in Verzweiflung. (Ich denke, das ist die Antwort auf die Titelfrage.) Bei geringfügigen Änderungen an der Abfrage oder den beteiligten Werten führt der Optimierer die Abfrage ohne Indexzusammenführung durch.
Eine Verbesserung der temporären Tabelle __codes
besteht darin, eine permanente Tabelle mit einem großen Wertebereich zu erstellen und dann einen Wertebereich aus dieser Tabelle in Ihrem Proc zu verwenden. Wenn Sie MariaDB verwenden, verwenden Sie die dynamisch erstellte „sequence“-Tabelle. Zum Beispiel die 'Tabelle' seq_1_to_100
ist effektiv eine einspaltige Tabelle mit den Nummern 1..100. Es muss nicht deklariert oder ausgefüllt werden.
Sie können die anderen REPEAT
loswerden Schleife durch Berechnen die Zeit von Code
.
Vermeidung von LOOPs
wird der größte Leistungsvorteil sein.
Erledige das alles, dann habe ich vielleicht noch andere Tipps.