2012-01-13 7 views
5

Ho una tabella piuttosto grande con 150.000 + record. Ha un sacco di campi come country_id, region_id, city_id, latitude, longitude, postal_code, solo per citarne alcuni.L'aggiunta di più specificità a una query SELECT lo rende più veloce?

Ho bisogno di selezionare da questa tabella in base alla latitudine e longitudine, nient'altro. La mia domanda è simile al seguente:

SELECT * FROM `mytable` 
    WHERE `latitude` = '$latitude' 
    AND `longitude` = '$longitude'; 

Ora, anche se il mio unico criterio per la selezione da questa tabella è latitudine/longitudine Mi chiedevo se l'aggiunta più specificità sarebbe accelerare la query come:

SELECT * FROM `mytable` 
    WHERE `city_id` = '320' 
    AND `latitude` = '$latitude' 
    AND `longitude` = '$longitude'; 

Sembra contatore intuitivo per me che aggiungere più condizioni alla query potrebbe accelerarlo ma allo stesso tempo sto restringendo il numero di risultati possibili con un ampio margine, assicurandomi innanzitutto che tutti i record selezionati provengano da un particolare id della città che so risiede nell'intervallo di latitudine e longitudine che specificherò per il prossimo.

Ci possono essere circa 150k record totali ma solo circa 10k da quella particolare città.

Quindi questo è assolutamente ragionevole o sto solo rendendo la query più dispendiosa in termini di tempo?

risposta

6

In generale, l'aggiunta di condizioni a una clausola WHERE nella query non avrà molto impatto sul tempo di esecuzione. Tuttavia, se si aggiungono indici ai campi menzionati nella clausola WHERE, è possibile migliorare notevolmente le prestazioni.

Quindi nel tuo esempio, se non c'è un indice su city_id e dovevi aggiungere quella condizione alla tua clausola WHERE e creare un indice su quel campo, probabilmente vedresti un notevole miglioramento delle prestazioni.

+0

Un po 'confuso da quando hai detto che aggiungere condizioni nella clausola where in genere non ha un grande impatto sulla velocità, e quindi dici che se indicizzo tutti e 3 i campi menzionati nella clausola where che otterrei un notevole miglioramento delle prestazioni. Quindi, per chiarire cosa consigli (supponendo che tutti e 3 i campi abbiano indici)? Dovrei aggiungere l'addizionale city_id = 'qualunque' prima delle altre 2 condizioni o no? – user1128811

+0

@ user1128811 - in generale, ogni volta che includo un campo in una condizione in una clausola WHERE (o un JOIN per quella materia), mi assicuro che quel campo sia indicizzato in modo appropriato. In questo modo, garantisco che il server del database eseguirà la scansione dell'indice (piccolo) anziché della tabella (grande) per eliminare i record dal set di risultati. Per quanto riguarda l'ordine in cui inserire le condizioni, questo è un compito che può essere contemplato con un ottimizzatore o un analizzatore di query. –

2

L'aggiunta di criteri potrebbe andare in entrambi i modi, ma in genere più criteri aiutano le prestazioni, soprattutto se le colonne hanno indici.

Nel tuo caso se hai un indice che include city_id e long e lat otterrai prestazioni molto migliori.

Problemi correlati