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

Como eu faria essa consulta ser executada mais rapidamente?


Índices

  • Você precisa - pelo menos - um índice em cada campo que é usado em um JOIN doença.

  • Índices nos campos que aparecem em WHERE ou GROUP BY ou ORDER BY cláusulas são na maioria das vezes úteis também.

  • Quando em uma tabela, dois ou mais campos são usados ​​em JOIns (ou WHERE ou GROUP BY ou ORDER BY), um índice composto (combinado) desses (dois ou mais) campos pode ser melhor do que índices separados. Por exemplo, em SiteNumbers tabela, os índices possíveis são os compostos (number_accountid, number_active) ou (number_active, number_accountid) .

  • A condição em campos que são booleanos (ON/OFF, ativo/inativo) às vezes está tornando as consultas mais lentas (já que os índices não são seletivos e, portanto, não são muito úteis). A reestruturação (normalização do pai) das tabelas é uma opção nesse caso, mas provavelmente você pode evitar a complexidade adicional.

Além do conselho usual (examinar o plano EXPLAIN, adicionar índices onde necessário, testar variações da consulta),

Percebo que na sua consulta há um Produto Cartesiano parcial. A tabela Accounts tem um relacionamento um-para-muitos com três tabelas FTPDetails , SiteNumbers e PPC . Isso tem o efeito de que, se você tiver, por exemplo, 1000 contas e cada conta estiver relacionada a, digamos, 10 FTPDetails, 20 SiteNumbers e 3 PPCs, a consulta retornará para cada conta 600 linhas (o produto de 10x20x3). No total, 600 mil linhas em que muitos dados são duplicados.

Em vez disso, você pode dividir a consulta em três mais um para dados de base (conta e as tabelas restantes). Dessa forma, apenas 34K linhas de dados (com comprimento menor) seriam transferidas:
Accounts JOIN Clients JOIN Users 
  (with all fields needed from these tables)
  1K rows

Accounts JOIN FTPDetails
  (with Accounts.account_id and all fields from FTPDetails)
  10K rows

Accounts JOIN SiteNumbers
  (with Accounts.account_id and all fields from SiteNumbers)
  20K rows

Accounts JOIN PPC
  (with Accounts.account_id and all fields from PPC)
  3K rows

e, em seguida, use os dados das 4 consultas no lado do cliente para mostrar as informações combinadas.

Eu adicionaria os seguintes índices:
Table Accounts
  index on (account_designer)
  index on (account_client)
  index on (account_active, account_id)
  index on (account_update)

Table FTPDetails
  index on (ftp_active, ftp_accountid)

Table SiteNumbers
  index on (number_active, number_accountid)

Table PPC
  index on (ppc_active, ppc_accountid)