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

Como as consultas de banco de dados PHP/MySQL funcionam exatamente?


Os detalhes dependem da implementação, mas geralmente falando, os resultados são armazenados em buffer. A execução de uma consulta em um banco de dados retornará algum conjunto de resultados. Se for suficientemente pequeno, todos os resultados podem ser retornados com a chamada inicial ou alguns podem ser e mais resultados são retornados à medida que você itera sobre o objeto de resultado.

Pense na sequência desta forma:
  1. Você abre uma conexão com o banco de dados;
  2. Há possivelmente uma segunda chamada para selecionar um banco de dados ou pode ser feito como parte de (1);
  3. Essa etapa de autenticação e conexão é (pelo menos) uma viagem de ida e volta ao servidor (ignorando conexões persistentes);
  4. Você executa uma consulta no cliente;
  5. Essa consulta é enviada ao servidor;
  6. O servidor precisa determinar como executar a consulta;
  7. Se o servidor executou a consulta anteriormente, o plano de execução ainda pode estar no cache de consulta. Caso contrário, um novo plano deve ser criado;
  8. O servidor executa a consulta conforme informado e retorna um resultado ao cliente;
  9. Esse resultado conterá algum buffer de linhas que depende da implementação. Pode ser 100 linhas ou mais ou menos. Todas as colunas são retornadas para cada linha;
  10. À medida que você busca mais linhas, eventualmente, o cliente solicitará mais linhas ao servidor. Isso pode ser quando o cliente se esgota ou pode ser feito preventivamente. Novamente, isso depende da implementação.

A ideia de tudo isso é minimizar as viagens de ida e volta ao servidor sem enviar de volta muito dados desnecessários, e é por isso que, se você pedir um milhão de linhas, não as obterá todas de uma vez.

As cláusulas LIMIT - ou qualquer cláusula de fato - modificarão o conjunto de resultados.

Por último, (7) é importante porque SELECT * FROM table WHERE a = 'foo' e SELECT * FROM table WHERE a = 'bar' são duas consultas diferentes no que diz respeito ao otimizador de banco de dados, portanto, um plano de execução deve ser determinado para cada uma separadamente. Mas uma consulta parametrizada (SELECT * FROM table WHERE a = :param ) com parâmetros diferentes é uma consulta e só precisa ser planejada uma vez (pelo menos até sair do cache de consulta).