Uau! Essa é a "fusão de índice" mais complicada que já vi.
Normalmente (talvez sempre ), você pode fazer um índice 'composto' para substituir um index-merge-intersect, e ter um desempenho melhor . Alterar
key2
de apenas (pinned)
para (pinned, DeviceId)
. Isso pode livrar-se do 'intersect' e acelerá-lo. Em geral, o Optimizer usa a mesclagem de índice apenas em desespero. (Acho que esta é a resposta para a pergunta do título.) Quaisquer pequenas alterações na consulta ou nos valores envolvidos, e o Otimizador realizará a consulta sem mesclagem de índice.
Uma melhoria na tabela temporária
__codes
é construir uma tabela permanente com um grande intervalo de valores e, em seguida, usar um intervalo de valores dessa tabela dentro do seu Proc. Se você estiver usando o MariaDB, use a tabela "sequência" criada dinamicamente. Por exemplo, a 'tabela' seq_1_to_100
é eficaz uma tabela de uma coluna com números 1..100. Não há necessidade de declará-lo ou preenchê-lo. Você pode se livrar do outro
REPEAT
loop por computação a hora de Code
. Evitando
LOOPs
será o maior benefício de desempenho. Faça tudo isso, então eu posso ter outras dicas.