Domanda

Limitare una query a un record di risultati migliorerà le prestazioni in una tabella MySQL di grandi dimensioni (più o meno) se la tabella ha un solo risultato corrispondente?

Per esempio

 select * from people where name = "Re0sless" limit 1

se c'è un solo record con quel nome?e se name la chiave primaria/era impostata su univoca?e vale la pena aggiornare la query o il guadagno sarà minimo?

È stato utile?

Soluzione

Se la colonna ha

un indice univoco:NO, non è più veloce

un indice non univoco:Forse, perché impedirà l'invio di eventuali righe aggiuntive oltre la prima corrispondente, se presente

nessun indice:A volte

  • se 1 o più righe corrispondono alla query, , poiché la scansione completa della tabella verrà interrotta dopo la corrispondenza della prima riga.
  • se nessuna riga corrisponde alla query, NO, perché sarà necessario completare una scansione completa della tabella

Altri suggerimenti

Se hai una query leggermente più complicata, con uno o più join, la clausola LIMIT fornisce all'ottimizzatore informazioni aggiuntive.Se prevede di abbinare due tabelle e restituire tutte le righe, a hash join è tipicamente ottimale.Un hash join è un tipo di join ottimizzato per grandi quantità di corrispondenze.

Ora, se l'ottimizzatore sa che hai superato LIMIT 1, sa che non elaborerà grandi quantità di dati.Può tornare a unione del ciclo.

In base al database (e anche alla versione del database) ciò può avere un enorme impatto sulle prestazioni.

Per rispondere alle tue domande in ordine:1) sì, se non è presente l'indice del nome.La query terminerà non appena troverà il primo record.togli il limite e deve eseguire una scansione completa della tabella ogni volta.2) n.le chiavi primarie/univoche sono garantite come uniche.La query dovrebbe interrompere l'esecuzione non appena trova la riga.

Credo che LIMIT sia qualcosa che viene fatto dopo che il set di dati è stato trovato e il set di risultati è stato creato, quindi non mi aspetto che faccia alcuna differenza.Tuttavia, rendere il nome la chiave primaria avrà un effetto positivo significativo poiché comporterà la creazione di un indice per la colonna.

Se "nome" è univoco nella tabella, potrebbe comunque verificarsi un miglioramento (molto minimo) in termini di prestazioni inserendo il vincolo di limite nella query.Se name è la chiave primaria, probabilmente non ce ne sarà alcuna.

Sì, noterai una differenza di prestazioni quando gestisci i dati.Un record occupa meno spazio di più record.A meno che tu non abbia a che fare con molte righe, questa non farebbe una grande differenza, ma una volta eseguita la query, i dati devono essere visualizzati, il che è costoso, o gestiti a livello di codice.In ogni caso, un record è più facile di più.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top