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.