2012-04-06 4 views
9

sto testando il mio disegno di database sotto carico e ho bisogno di recuperare solo un numero fisso di righe (5000)Recupero solo un numero fisso di righe in MySQL

posso specificare un limite per raggiungere questo obiettivo, ma sembra che la query crea il set di risultati di tutte le righe corrispondenti e quindi restituisce solo il numero di righe specificato nel limite. È così che viene implementato?

C'è un MySQL per leggere una riga, leggere un altro e fondamentalmente fermarsi quando recupera la 5000a riga corrispondente?

+0

È possibile utilizzare la clausola LIMIT per selezionare un set di righe. Non capisco qual è la tua confusione? – Teja

+0

Dalla documentazione, se ho capito bene, LIMIT si applica solo quando la serie di risultati è stata creata dalla query SELECT. Quindi, la query SELECT va e recupera tutte le righe corrispondenti da una tabella e una volta che tutte le righe corrispondenti sono state recuperate, viene restituito solo il numero di righe specificato nella clausola LIMIT. Mi chiedevo se esistesse un modo per la query SELECT per recuperare solo il numero di righe che voglio. – Sandman

risposta

16

MySQL è intelligente nel fatto che se si specifica un LIMIT 5000 nella query, ed è possibile produrre quel risultato senza prima generare l'intero set di risultati, quindi non verrà generato l'intero risultato.

Per esempio, la seguente query:

SELECT * FROM table ORDER BY column LIMIT 5000 

Questa query dovrà eseguire la scansione dell'intero table a meno che non ci sia un indice su column, nel qual caso si fa la cosa intelligente e utilizza l'indice per trovare il righe con il più piccolo column.

+0

Grazie Keith.Bene, la mia query SELECT è qualcosa del genere- selezionare SQL_NO_CACHE * da readings_dev_1 dove colonna tra '2012-03-30' e '2012-04-06'. La query sarà abbastanza intelligente da fermarsi dopo 5000 righe se dovessi inserire una clausola LIMIT sulla query? – Sandman

+0

Lo sarà se si ha un indice su 'readings_dev_1.column'. –

+0

Se non sto facendo un ordine BY su questa query di selezione, avrò ancora bisogno di un indice su questa colonna? Capisco la necessità di un indice su una colonna se sto ordinando in modo che la query sia abbastanza intelligente da fermarsi dopo 5000 righe. Tuttavia, nel mio caso non ho bisogno di un ordine sulle righe restituite. Quindi ho ragione nel presumere che non avrò bisogno di un indice su quella colonna e la query continuerà a fare la cosa intelligente e fermarmi dopo 5000 righe? – Sandman

5
SELECT * FROM `your_table` LIMIT 0, 5000 

Questo visualizzerà i primi 5000 risultati dal database.

SELECT * FROM `your_table` LIMIT 1001, 5000 

Questo mostrerà record 1001,1002,1003 ..... 6000

2

complessità di tali interrogazione è O (LIMIT) (a meno che non si specifica ORDER BY).

Significa che se 10000000 righe corrispondono alla query e si specifica un limite uguale a 5000, la complessità sarà O (5000).

+0

Questo è un modo sintetico di metterlo. Grazie. Avevo l'impressione che SELECT sarebbe ancora O (1000000) se avessi avuto molte righe corrispondenti, ma LIMIT avrebbe limitato la dimensione del set di risultati restituito a me. Grazie. – Sandman

0

Il piano esatto utilizzato da Query Optimizer dipende dalla query (quali campi vengono selezionati, l'importo LIMIT e se esiste un ORDER BY) e la tabella (chiavi, indici e numero di righe nella tabella). La selezione di una colonna non indicizzata e/o l'ordinamento da parte di una colonna non chiave genererà un piano di esecuzione diverso rispetto alla selezione di una colonna e all'ordinamento in base alla colonna della chiave primaria. Più avanti non toccherà nemmeno la tabella e elaborerà solo il numero di righe specificato nel LIMIT.

3

@ Jarosław Gomułka è giusto
Se si utilizza LIMITE con ORDER BY, MySQL termina la selezione non appena ha trovato le prime file ROW_COUNT del risultato ordinato, piuttosto che l'ordinamento l'intero risultato. Se l'ordine viene eseguito utilizzando un indice, questo è molto veloce. In entrambi i casi, dopo che le righe iniziali sono state trovate, non è necessario ordinare alcun resto del set di risultati e MySQL non lo fa. se il set non è ordinato termina l'operazione SELECT non appena ha abbastanza righe per il set di risultati.