Índices
-
Você precisa - pelo menos - um índice em cada campo que é usado em umJOIN
doença.
-
Índices nos campos que aparecem emWHERE
ouGROUP BY
ouORDER 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, emSiteNumbers
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)