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

Mysql muito lento na consulta simples entre duas tabelas


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ê.)