web-dev-qa-db-fra.com

Récupérer uniquement un nombre fixe de lignes dans MySQL

Je teste la conception de ma base de données sous charge et je n'ai besoin de récupérer qu'un nombre fixe de lignes (5000)

Je peux spécifier une LIMIT pour y parvenir, mais il semble que la requête crée le jeu de résultats de toutes les lignes qui correspondent, puis retourne uniquement le nombre de lignes spécifié dans la limite. Est-ce ainsi que cela est mis en œuvre?

Y a-t-il un moyen pour MySQL de lire une ligne, d'en lire une autre et de s'arrêter quand il récupère la 5000ème ligne correspondante?

18
Sandman

MySQL est intelligent en ce que si vous spécifiez un LIMIT 5000 dans votre requête, et il est possible de produire ce résultat sans générer d'abord le jeu de résultats entier, puis il ne construira pas le résultat entier.

Par exemple, la requête suivante:

SELECT * FROM table ORDER BY column LIMIT 5000

Cette requête devra analyser l'intégralité de table sauf s'il existe un index sur column, auquel cas elle fait la chose intelligente et utilise l'index pour trouver les lignes avec la plus petite column.

25
Keith Randall
 SELECT * FROM `your_table` LIMIT 0, 5000 

Cela affichera les 5000 premiers résultats de la base de données.

 SELECT * FROM `your_table` LIMIT 1001, 5000 

Cela montrera les enregistrements de 1001 à 6000 (en comptant de 0).

7
Teja

@ Jarosław Gomułka a raison
Si vous utilisez LIMIT avec ORDER BY, MySQL termine le tri dès qu'il a trouvé les premières lignes row_count du résultat trié, plutôt que de trier le résultat entier. Si la commande est effectuée à l'aide d'un index, c'est très rapide. Dans les deux cas, une fois les lignes initiales trouvées, il n'est pas nécessaire de trier le reste de l'ensemble de résultats, et MySQL ne le fait pas. si l'ensemble n'est pas trié, il termine l'opération SELECT dès qu'il a suffisamment de lignes pour l'ensemble de résultats.

3
aquasan

La complexité d'une telle requête est O(LIMIT) (sauf si vous spécifiez order by).

Cela signifie que si 10000000 lignes correspondent à votre requête et que vous spécifiez une limite égale à 5000, la complexité sera O (5000).

2

Le plan exact utilisé par l'optimiseur de requêtes dépend de votre requête (quels champs sont sélectionnés, du montant LIMIT et s'il existe un ORDER BY) et de votre table (clés, index et nombre de lignes dans la table). La sélection d'une colonne non indexée et/ou l'ordre par une colonne non clé va produire un plan d'exécution différent de la sélection d'une colonne et de l'ordre par la colonne de clé primaire. Ce dernier ne touchera même pas la table et ne traitera que le nombre de lignes spécifié dans votre LIMIT.

0
mdoyle

Comme je l'ai expliqué dans cet article , chaque base de données définit son propre ay de limiter la taille du jeu de résultats dépend de la base de données que vous utilisez.

Alors que la spécification SQL: 2008 définit une syntaxe standard pour limiter une requête SQL, MySQL 8 ne la prend pas en charge.

Par conséquent, sur MySQL, vous devez utiliser la clause LIMIT pour restreindre l'ensemble de résultats aux enregistrements Top-N:

SELECT
    title
FROM
    post
ORDER BY
    id DESC
LIMIT 50

Notez que nous utilisons une clause ORDER BY car, sinon, il n'y a aucune garantie quant aux premiers enregistrements à inclure dans le jeu de résultats renvoyé.

0
Vlad Mihalcea