Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum verwendet MySQL hier nicht immer Index Merge?

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.