Índices
-
Necesitas - al menos - un índice en cada campo que se usa en un
JOIN
condición. -
Índices en los campos que aparecen en
WHERE
oGROUP BY
oORDER BY
las cláusulas también son útiles la mayor parte del tiempo. -
Cuando en una tabla se usan dos o más campos en JOIns (o WHERE o GROUP BY u ORDER BY), un índice compuesto (combinado) de estos (dos o más) campos puede ser mejor que índices separados. Por ejemplo, en
SiteNumbers
tabla, los índices posibles son el compuesto(number_accountid, number_active)
o(number_active, number_accountid)
. -
Las condiciones en los campos que son booleanos (ACTIVADO/DESACTIVADO, activo/inactivo) a veces ralentizan las consultas (ya que los índices no son selectivos y, por lo tanto, no son muy útiles). Reestructurar (principalmente normalizar) las tablas es una opción en ese caso, pero probablemente pueda evitar la complejidad adicional.
Además de los consejos habituales (examinar el plan EXPLAIN, agregar índices donde sea necesario, probar variaciones de la consulta),
Observo que en su consulta hay un producto cartesiano parcial. La tabla Accounts
tiene una relación de uno a muchos con tres tablas FTPDetails
, SiteNumbers
y PPC
. Esto tiene el efecto de que si tiene, por ejemplo, 1000 cuentas y cada cuenta está relacionada con, digamos, 10 FTPDetails, 20 SiteNumbers y 3 PPC, la consulta devolverá 600 filas para cada cuenta (el producto de 10x20x3). En total 600K filas donde se duplican muchos datos.
En su lugar, podría dividir la consulta en tres más uno para los datos base (Cuenta y el resto de las tablas). De esa forma, solo se transferirían 34 000 filas de datos (de menor longitud):
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
y luego use los datos de las 4 consultas en el lado del cliente para mostrar información combinada.
Agregaría los siguientes í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)