Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi cette requête INNER JOIN/ORDER BY mysql est-elle si lente ?

(Je suppose que vous vouliez taper ids.customer_id = customer.customer_id et non customer_ids.customer_id)

Sans ORDER BY, mysql a saisi les 10 premiers identifiants de type 10 (indexés), a recherché le client pour eux et a terminé. (Notez que le LEFT JOIN ici est vraiment un INNER JOIN car les conditions de jointure ne seront valables que pour les lignes qui ont une correspondance dans les deux tables)

Avec ORDER BY, mysql récupère probablement tout type=10 clients puis en les triant par prénom pour trouver les 10 premiers.

Vous pouvez accélérer cela en dénormalisant la table des clients (copier le type dans l'enregistrement client) ou en créant une table de mappage pour contenir le customer_id, name, type tuples. Dans les deux cas, ajoutez un index sur (type, name) . Si vous utilisez la table de mappage, utilisez-la pour effectuer une jointure à trois voies avec les clients et les identifiants.

Si type=10 est raisonnablement commun, vous pouvez également forcer la requête à parcourir la table des clients par nom et vérifier le type pour chacun avec STRAIGHT JOIN. Ce ne sera pas aussi rapide qu'un index composé, mais ce sera plus rapide que d'extraire toutes les correspondances.

Et comme suggéré ci-dessus, exécutez un EXPLAIN sur votre requête pour voir le plan de requête utilisé par mysql.