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

MySQL est-ce que mes index sont bons ?

Écrivez la requête de cette façon :

SELECT *
    FROM orders
    JOIN users  ON orders.id_user = users.id
    WHERE orders.status='new'

Ne spécifiez pas les index à utiliser.

En commençant par WHERE clause, cela ressemble à ceci pourrait être utile :INDEX(status) . Mais puisque "statut" sonne comme un "drapeau" avec une faible cardinalité, l'optimiseur peut décidez d'ignorer l'index et effectuez simplement une analyse de la table. Ça va. C'est OK car il est plus rapide de faire un parcours de table que de rebondir entre un index et les données, lorsque l'index n'est pas très sélectif. Dans tous les cas, laissez la décision à l'optimiseur.

Maintenant qu'il traite les orders , il doit JOIN aux users . La seule façon de le faire est d'avoir un index sur id . Ce nom ("id") implique qu'il pourrait s'agir de la PRIMARY KEY , c'est ça ? (Veuillez fournir SHOW CREATE TABLE .)

Livre de recettes d'index

L'autre requête que vous avez mentionnée doit être écrite

SELECT * FROM users WHERE id=33

Et, comme déjà discuté, l'index (PRIMARY KEY ?) sur id est la bonne chose.

Il n'y a aucun avantage (pour les SELECTs donnés , au moins) pour INDEX(status, id_user) . Votre sélection inclut toutes les colonnes (* ); il n'avait récupéré que id_user , alors un tel index serait « couvrant » et présenterait certains avantages.