Páni! To je nejsložitější „sloučení indexů“, jaké jsem kdy viděl.
Obvykle (možná vždy ), můžete vytvořit „složený“ index, který nahradí index-merge-intersect, a dosáhnete lepšího výkonu . Změňte key2 pouze z (pinned) na (pinned, DeviceId) . To může zbavit se 'průniku' a urychlit to.
Obecně platí, že Optimalizátor používá slučování indexů pouze v zoufalství. (Myslím, že toto je odpověď na otázku v názvu.) Jakékoli drobné změny v dotazu nebo příslušných hodnotách a Optimalizátor provede dotaz bez sloučení indexu.
Vylepšení dočasné tabulky __codes je vytvořit trvalou tabulku s velkým rozsahem hodnot a poté použít rozsah hodnot z této tabulky ve svém Proc. Pokud používáte MariaDB, použijte dynamicky vytvořenou tabulku „sekvence“. Například 'tabulka' seq_1_to_100 je efektivní tabulka jednoho sloupce s čísly 1..100. Není třeba jej deklarovat nebo vyplňovat.
Můžete se zbavit dalšího REPEAT smyčka pomocí výpočtu čas z Code .
Vyhněte se LOOPs bude největší výkonnostní výhodou.
Udělejte vše, pak mám možná další tipy.