mysql - tuning - sql limit range




MySQL-ORDINA DI e LIMIT (6)

È possibile aggiungere [asc] o [desc] alla fine dell'ordine per ottenere i record più recenti o più recenti

Ad esempio, questo ti darà prima gli ultimi record

ORDER BY stamp DESC

Aggiungi la clausola LIMIT dopo ORDER BY

Ho una query che assomiglia a questa:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

Come funziona ORDER BY? Ordinerà tutti i record, quindi otterrà i primi 20 o otterrà 20 record e li publish_date campo publish_date ?

Se è l'ultimo, non hai la garanzia di ottenere veramente gli ultimi 20 articoli.


È possibile utilizzare questo codice SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10 dove 0 è un limite iniziale di record e 10 numero di record


La clausola LIMIT può essere utilizzata per limitare il numero di righe restituite dall'istruzione SELECT. LIMIT accetta uno o due argomenti numerici, che devono essere entrambi costanti integer non negativi (tranne quando si usano istruzioni preparate).

Con due argomenti, il primo argomento specifica l'offset della prima riga da restituire e il secondo specifica il numero massimo di righe da restituire. L'offset della riga iniziale è 0 (non 1):

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15

Per recuperare tutte le righe da un determinato offset fino alla fine del set di risultati, è possibile utilizzare un numero elevato per il secondo parametro. Questa istruzione recupera tutte le righe dalla 96a riga all'ultima:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

Con un argomento, il valore specifica il numero di righe da restituire dall'inizio del set di risultati:

SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows

In altre parole, LIMIT rowcount è equivalente a LIMIT 0, row_count.

Tutti i dettagli su: http://dev.mysql.com/doc/refman/5.0/en/select.html


Normalmente viene applicato LIMIT come ultima operazione, quindi il risultato verrà prima ordinato e quindi limitato a 20. In effetti, l'ordinamento si interrompe non appena vengono trovati i primi 20 risultati ordinati.


Proprio come dice @James, ordinerà tutti i record, quindi otterrà le prime 20 righe.

Dato che è così, hai la garanzia di ottenere i primi 20 articoli pubblicati, quelli più recenti non saranno mostrati.

Nella tua situazione, ti consiglio di aggiungere desc order by publish_date , se vuoi gli articoli più recenti, allora l'articolo più recente sarà il primo.

Se devi mantenere il risultato in ordine crescente e desideri solo i 10 articoli più recenti, puoi chiedere a mysql di ordinare il risultato due volte.

Questa query di seguito ordinerà il risultato decrescente e limiterà il risultato a 10 (che è la query all'interno della parentesi). Sarà ancora ordinato in ordine decrescente, e non siamo soddisfatti, quindi chiediamo a mysql di riordinarlo ancora una volta. Ora abbiamo il risultato più recente nell'ultima riga.

select t.article 
from 
    (select article, publish_date 
     from table1
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

Se hai bisogno di tutte le colonne, è fatto in questo modo:

select t.* 
from 
    (select * 
     from table1  
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

Io uso questa tecnica quando scrivo manualmente delle query per esaminare il database per varie cose. Non l'ho usato in un ambiente di produzione, ma ora quando lo ho segnato, l'ordinamento extra non ha impatto sulle prestazioni.


Se esiste un indice adatto, in questo caso nel campo publish_date , MySQL non deve eseguire la scansione dell'intero indice per ottenere i 20 record richiesti: i 20 record saranno trovati all'inizio dell'indice. Ma se non esiste un indice adatto, sarà necessaria una scansione completa della tabella.

C'è un articolo sul blog delle prestazioni MySQL del 2009 su questo.





limit