Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que o MySQL nem sempre usa a mesclagem de índice aqui?


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.