2012-01-03 4 views
2
SELECT value FROM table WHERE id IN ("1","2","3", ... "500000") 

Avoir une requête qui se lit comme ci-dessus avec environ 500 000 valeurs entre parenthèses.Requête MySQL "IN" 500 000 enregistrements

Existe-t-il une meilleure façon d'effectuer une recherche? Cette méthode est très lourde/lente.

+0

Comment avez-vous les ids 500K ? D'une autre requête? Ou sont-ils dans une liste dans votre code d'application? –

+1

D'où viennent ces 500 000 articles? Si elles proviennent de la base de données, vous pouvez vous joindre à. Difficile d'imaginer un utilisateur qui tape 500 000 valeurs :-) – drdwilcox

+0

A partir d'une liste de données qui n'est pas en MySQL. Je suppose que je pourrais ajouter ces données et faire JOIN. Serait-ce plus rapide? – reefine

Répondre

9

Placez les 500 000 valeurs dans une autre table et rejoignez-la.

SELECT t.value 
    FROM table t 
     INNER JOIN NewTempTable n 
      ON t.id = n.id 
2

vous êtes proche de la limite de taille de paquet mysql (il est de 16 MB), il est certainement une mauvaise idée.

de quelle source avez-vous ces demi-millions d'identifiants? ne pourriez-vous pas les stocker dans la base de données et effectuer une jointure?

2

Vous pouvez effectuer les opérations suivantes:

Étape 01: Faire un tableau des ID

DROP TABLE IF EXISTS lookup_ids; 
CREATE TABLE lookup_ids SELECT id FROM `table` WHERE 1=2; 
ALTER TABLE lookup_ids ADD PRIMARY KEY (id); 

Étape 02: Vous insérez les 500.000 valeurs dans lookup_ids

Étape 03: Faire une bonne index de couverture sur table

ALTER TABLE `table` ADD UNIQUE INDEX id_value_ndx (id,value); 

Étape 04: Exécutez e REJOIGNEZ

SELECT t.value FROM `table` t INNER JOIN lookup_ids i USING (id); 

ou

SELECT t.value FROM `table` t NATURAL JOIN lookup_ids i; 

OPPOSITION: Les étapes 1-3 ne pas besoin d'être répétée, sauf si vous avez un ensemble différent de ids de consultation pour charger

Questions connexes