"Limit 1000,25" vs "limit 25 Offset 1000"


11

Di recente ho scoperto che MySQL ha una offsetfunzione. Ho cercato di trovare documentazione sui risultati dell'offset o sulla differenza tra offset e la variante del limite, ma non riesco a trovare quello che sto cercando.

Diciamo che ho 10.000 righe in una tabella e voglio 25 risultati, dalla riga 1.000. Per quanto mi è arrivato finora, ho potuto fare entrambi per ottenere lo stesso risultato:

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

Quello che vorrei sapere è la differenza tra i due.

  • Questo fa davvero lo stesso o la mia comprensione è sbagliata?
  • È uno più lento / più veloce nelle tabelle più grandi
  • Il risultato dell'offset cambia quando lo faccio WHERE column=1(diciamo che la colonna ha> 100 valori diversi)
  • Il risultato dell'offset cambia quando lo faccio ORDER BY column ASC(supponendo che abbia valori casuali)

Se questa è una domanda "stupida" e qualcuno conosce una documentazione che illumina l'argomento, si prega di aggiungerli nelle risposte.
Ho la sensazione che l'offset salta le prime X righe trovate nel database, ignorando l'ordinamento e il dove.


La documentazione di MySQL lo spiega perfettamente. C'è un motivo per cui non ti interessava guardarlo da solo?
siride,

1
"Per compatibilità con PostgreSQL, MySQL supporta anche la sintassi dell'offset LIMIT Row_count OFFSET." (da dev.mysql.com/doc/refman/5.5/en/select.html ).
siride,

Perché questo non risponde ancora alle mie domande. Dalla tua citazione (e dal loro testo sulla pagina) dovrei concludere che l'offset è la stessa cosa del limite, scritto solo in modo diverso, come se il LIMIT fosse il selettore di stenografia?
Martijn,

1
è una sintassi diversa per esprimere la stessa cosa. Le altre tue domande secondarie sono completamente diverse dal titolo e dalla prima parte del tuo post.
siride,

1
Capisco che se è la stessa cosa, le altre query non verranno eseguite diversamente in nessuna delle due situazioni. Non ero convinto che fosse la stessa cosa, quella era la risposta che stavo cercando, grazie.
Martijn,

Risposte:


9

In termini di operazione

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

non c'è assolutamente alcuna differenza nelle dichiarazioni

Il commento di @ siride è esattamente il punto.

LIMIT 1000,25 si intende LIMIT 25 OFFSET 1000

Dalla stessa documentazione

LIMIT row_count è equivalente a LIMIT 0, row_count

LE TUE DOMANDE ATTUALI

  • Questo fa davvero lo stesso o la mia comprensione è sbagliata?
  • È uno più lento / più veloce nelle tabelle più grandi

Poiché entrambe le query sono uguali, non vi è alcuna differenza

  • Il risultato dell'offset cambia quando faccio WHERE colonna = 1 (diciamo che la colonna ha> 100 valori diversi)
  • Il risultato dell'offset cambia quando eseguo ORDER BY colonna ASC (supponendo che abbia valori casuali)

L'uso LIMITnon modifica alcun set di risultati. Navigano semplicemente all'interno del set di risultati.

Questa domanda

SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25

sarebbe diverso da

SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;

perché il LIMIT viene applicato in una fase diversa.

La prima query non restituisce nulla se tablename ha meno di 1000 righe

La seconda query non restituisce nulla se la sottoquery ha meno di 1000 righe

CONCLUSIONE

Dovrai scolpire la query per assicurarti di ordinare i dati nella fase corretta


1
Grazie. Questo: "Non c'è assolutamente alcuna differenza nelle dichiarazioni" era esattamente quello che stavo cercando, e con quel po 'di informazioni posso vedere che l'ordinamento o dove non importa. Non ero sicuro che fosse la stessa cosa, e nel codice il diavolo è nei dettagli, mi piacerebbe saperlo per certo :)
Martijn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.