No InnoDB cada índice contém a chave primária implicitamente.
O plano de explicação mostra que o índice
IDX_NOME
é usado na tabela Paziente
. O DBMS procura o nome no índice e encontra ID_PAZIENTE
lá, que é a chave que precisamos para acessar a outra tabela. Portanto, não há nada a acrescentar. (Em outro DBMS teríamos adicionado um índice composto em (NOME, ID_PAZIENTE)
para que isso aconteça.) Depois, há a tabela
Analisi
considerar. Encontramos um registro via FK_ANALISI_PAZIENTE
que contém o ID_PAZIENTE
que é usado para encontrar a correspondência e, implicitamente, a chave primária ID_ANALISI
que poderia ser usado para acessar a tabela, mas isso nem é necessário, pois temos todas as informações que precisamos do índice. Não há mais nada que precisemos encontrar na tabela. (Novamente, em outro DBMS teríamos adicionado um índice composto em (ID_PAZIENTE, ID_ANALISI)
ter um índice de cobertura.) Então o que acontece é meramente:leia um índice para ler o outro índice para contar. Perfeito. Não há nada para adicionar.
Nós poderíamos substitua
COUNT(analisi0_.ID_ANALISI)
com COUNT(*)
como o primeiro diz apenas "contar registros onde ID_ANALISI
não é nulo", que é sempre o caso de ID_ANALISI
é a chave primária da tabela. Portanto, é mais simples usar o último e dizer "contar registros". No entanto, não espero que isso acelere a consulta significativamente, se for o caso. Então, do ponto de vista da consulta, não há nada para acelerar isso. Aqui estão mais coisas que vêm à mente:
- Tabelas particionadas? Não, eu não veria nenhum benefício nisso. Poderia ser mais rápido se a consulta fosse executada em threads paralelos, mas até onde eu sei, não há execução paralela em várias partições no MySQL. (Mas posso estar errado.)
- Desfragmentando as tabelas? Não, as próprias tabelas nem são acessadas na consulta.
- Isso nos deixa com:Compre hardware melhor. (Desculpe não ter nenhum conselho melhor para você.)