MySQL “DANS” le rendement de l'opérateur sur des (grands?) nombre de valeurs

J'ai fait des expériences avec MongoDB et Redis ces derniers temps, et il semblerait qu'il y a souvent des cas où l'on serait de stocker un tableau de id dans MongoDB ou Redis. Je vais rester avec le Redis, pour cette question, depuis que j'ai fais une demande sur la base de DANS opérateur.

Je me demandais comment performant, il est de la liste d'un grand nombre (300-3000) de id à l'intérieur de l'opérateur, qui ressemblerait à quelque chose comme ceci:

SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 3000)

Imaginer quelque chose d'aussi simple que d'une produits et catégories tableau que vous pourrait normalement s'unissent afin d'obtenir le produits à partir d'un certain catégorie. Dans l'exemple ci-dessus, vous pouvez voir qu'en vertu d'une catégorie donnée dans le Redis ( category:4:product_ids ) je retourne tous les id de produit à partir de la catégorie avec l'id 4, et placez-la au-dessus de SELECT requête à l'intérieur de la IN opérateur.

Comment performant est-ce?

Est-ce un "ça dépend" de la situation? Ou est-il un béton "c'est (in)acceptable" ou "rapide" ou "lent" ou devrais-je ajouter un LIMIT 25, ou n'est-ce pas de l'aide?

SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 3000)
LIMIT 25

Ou dois-je couper le tableau des id de produit renvoyé par le Redis à limiter à 25 ans et seulement ajouter 25 id de la requête plutôt que de 3000 et LIMIT-ing à 25 à partir de l'intérieur de la requête?

SELECT id, name, price
FROM products
WHERE id IN (1, 2, 3, 4, ...... 25)

Des suggestions/commentaires est très apprécié!

  • Je ne suis pas sûr exactement ce que vous demandez? Une requête avec "id IN(1,2,3, ...3000))" est plus rapide que 3000 requêtes avec "id = valeur". Mais une jointure avec la catégorie "= 4" sera plus rapide que les deux ci-dessus.
  • Droit, mais, depuis un produit peut appartenir à plusieurs catégories I vous ne pouvez pas faire de la "catégorie = 4". Utilisation de Redis je voudrais stocker toutes les id des produits qui appartiennent à certaines catégories et ensuite interroger sur qui. Je suppose que la vraie question est de savoir comment le id IN (1,2,3 ... 3000) par rapport à la table de JOINTURE de products_categories. Ou est-ce que vous avez dit?
  • Il suffit de faire attention à partir de ce bogue dans MySql stackoverflow.com/questions/3417074/...
  • Bien sûr, il n'ya aucune raison pourquoi il ne devrait pas être aussi efficace que toute autre méthode de récupération de indexés lignes; tout dépend si la base de données auteurs ont testé et optimisé pour cela. En termes de complexité de calcul que nous allons faire, au pire, une O(n log N) tri sur le IN de l'alinéa (cela peut même être linéaire sur une liste triée comme vous le montrez, en fonction de l'algorithme), puis linéaire intersection/recherches.