Mysql
 sql >> Database >  >> RDS >> Mysql

mysql:scelta della query più efficiente tra le due

Non c'è dubbio che la versione 1 - clausole separate in ciascuna parte del sindacato - sarà più veloce. Diamo un'occhiata al motivo per cui la versione - dove la clausola sul risultato dell'unione - è peggiore:

  • volume di dati:ci saranno sempre più righe nel risultato dell'unione, perché ci sono meno condizioni su quali righe vengono restituite. Ciò significa più I/O del disco (a seconda degli indici), più spazio di archiviazione temporaneo per contenere il set di righe, il che significa più tempo di elaborazione
  • scansione ripetuta:l'intero risultato dell'unione deve essere scansionato di nuovo per applicare la condizione, quando avrebbe potuto essere gestito durante la scansione iniziale. Ciò significa una doppia gestione del set di righe, anche se probabilmente in memoria, è comunque un lavoro extra.
  • Gli indici non vengono utilizzati per le clausole where su un risultato di unione. Se hai un indice sui campi della chiave esterna e postType, non verrebbe utilizzato

Se vuoi il massimo delle prestazioni, usa UNION ALL , che passa le righe direttamente nel risultato senza sovraccarico, invece di UNION , che rimuove i duplicati (di solito ordinando) e può essere costoso e non è necessario in base ai tuoi commenti

Definisci questi indici e usa la versione 1 per le massime prestazioni:

create index t1_authorID_postType on t1(authorID, postType);
create index t1_websiteID_postType on t1(websiteID, postType);