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

Perché questa query INNER JOIN/ORDER BY mysql è così lenta?

(Suppongo che tu intendessi digitare ids.customer_id = customer.customer_id e non customer_ids.customer_id)

Senza ORDER BY mysql ha preso i primi 10 ID di tipo 10 (indicizzati), ha cercato il cliente per loro ed è stato fatto. (Nota che il LEFT JOIN qui è davvero un INNER JOIN perché le condizioni di join valgono solo per le righe che hanno una corrispondenza in entrambe le tabelle)

Con ORDER BY mysql probabilmente sta recuperando tutto digita=10 clienti, quindi ordinali per nome per trovare i primi 10.

Puoi velocizzarlo denormalizzando la tabella dei clienti (copiando il tipo nel record del cliente) o creando una tabella di mappatura per contenere customer_id, name, type tuple. In entrambi i casi, aggiungi un indice su (type, name) . Se utilizzi la tabella di mappatura, utilizzala per eseguire un join a 3 vie con clienti e ID.

Se type=10 è ragionevolmente comune, puoi anche forzare la query a percorrere la tabella dei clienti per nome e controllare il tipo per ciascuno con STRAIGHT JOIN. Non sarà veloce come un indice composto, ma sarà più veloce che visualizzare tutte le corrispondenze.

E come suggerito sopra, esegui un EXPLAIN sulla tua query per vedere il piano di query utilizzato da mysql.