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

MySQL :récupère un grand select par morceaux

Vous pouvez essayer d'utiliser le LIMIT fonctionnalité. Si vous faites ceci :

SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000

Vous obtiendrez les 1 000 premières lignes. Le premier LIMIT la valeur (0) définit la ligne de départ dans le jeu de résultats. Il est indexé à zéro, donc 0 signifie "la première ligne". Le deuxième LIMIT value est le nombre maximum de lignes à récupérer. Pour obtenir les prochaines séries de 1 000, procédez comme suit :

SELECT * FROM MyTable ORDER BY whatever LIMIT 1000,1000 -- rows 1,001 - 2,000
SELECT * FROM MyTable ORDER BY whatever LIMIT 2000,1000 -- rows 2,001 - 3,000

Etc. Lorsque le SELECT ne renvoie aucune ligne, vous avez terminé.

Cependant, cela ne suffit pas en soi, car toute modification apportée à la table pendant que vous traitez vos lignes de 1 000 lignes à la fois perturbera l'ordre. Pour figer les résultats dans le temps, commencez par interroger les résultats dans une table temporaire :

CREATE TEMPORARY TABLE MyChunkedResult AS (
  SELECT *
  FROM MyTable
  ORDER BY whatever
);

Note complémentaire :il est conseillé de s'assurer au préalable que la table temporaire n'existe pas :

DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;

Dans tous les cas, une fois la table temporaire en place, extrayez-en les morceaux de ligne :

SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.

Je vous laisse le soin de créer la logique qui calculera la valeur limite après chaque morceau et vérifiera la fin des résultats. Je recommanderais également des morceaux beaucoup plus grands que 1 000 enregistrements; c'est juste un nombre que j'ai choisi dans l'air.

Enfin, il est de bon ton de supprimer la table temporaire lorsque vous avez terminé :

DROP TEMPORARY TABLE MyChunkedResult;