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

Indice MySQL che rallenta la query

Sembra che article_id sia la chiave primaria per la tabella degli articoli.

Dato che stai raggruppando per article_id, MySQL deve restituire i record in ordine per quella colonna, al fine di eseguire il GROUP BY.

Puoi vedere che senza l'indice, esegue la scansione di tutti i record nella tabella degli articoli, ma sono almeno in ordine per article_id, quindi non è richiesto alcun ordinamento successivo. L'ottimizzazione LIMIT può essere applicata qui, poiché è già in ordine, può semplicemente interrompersi dopo aver ottenuto cinque righe.

Nella query con l'indice su tag.name, invece di scansionare l'intera tabella degli articoli, utilizza l'indice, ma rispetto alla tabella dei tag, e inizia da lì. Sfortunatamente, quando si esegue questa operazione, i record devono essere successivamente ordinati in base all'articolo.article_id per completare la clausola GROUP BY. L'ottimizzazione LIMIT non può essere applicata poiché deve restituire l'intero set di risultati, quindi ordinarlo, in modo da ottenere le prime 5 righe.

In questo caso, MySQL indovina in modo errato.

Senza la clausola LIMIT, suppongo che l'utilizzo dell'indice sia più veloce, il che forse è ciò che MySQL stava indovinando.