sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo haría que esta consulta se ejecutara más rápido?

Í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 o GROUP BY o ORDER 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)