Question

J'ai une relation à un de la table des utilisateurs à des adresses. Où un utilisateur peut avoir une adresse de recherche et une adresse vérifiée.

J'ai deux index sur la table des adresses:

  • Index sur le champ d'état
  • Index sur user_id

J'essaie de récupérer les adresses pour certains utilisateurs uniquement, et les adresses dont l'état est autre que manual_verification.

Voici ma requête:

SELECT users.id 
FROM "users" INNER JOIN addresses 
     ON  addresses.user_id = users.id 
     and addresses.type = 'VerifiedAddress' 
WHERE ("users".deleted_at IS NULL) 
  AND (users.id in (11144,10569,21519,783,15671,21726,17787,11665,
                    19579,12226,1324,9413,5461,20981,12906) 
  and addresses.state != 'manual_verification')

Expliquez la requête ci-dessus:http://explain.depesz.com/s/rtj

Il faut 37 ms. Parfois plus en fonction du nombre d'utilisateurs.

Je pense que c'est une bonne requête, mais notre équipe doit enquêter sur cela, et je recherche des conseils d'optimisation. Je veux dire que j'ai fait le seul champ, il y a un index sur user_id (adresses) et l'état (adresses).

Y a-t-il autre chose que je peux faire / essayer?

Mise à jour

J'ai découvert que cette requête fonctionne beaucoup plus rapidement:

 SELECT "addresses"."user_id" 
    FROM "addresses" 
    WHERE "addresses"."type" IN ('VerifiedAddress') 
    AND (user_id in (9681,23824,23760,20098,962,14730,12294,9552,534,
                     553,5837,6768,6583,956,24179) and state != 'manual_verification')

Expliquez cette requête:http://explain.depesz.com/s/nhrr

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top