Mysql
 sql >> Database >  >> RDS >> Mysql

Modello di dati efficiente per query di intervallo

In realtà, la tua chiave primaria ha poco senso in termini di query di tale intervallo. Indica solo coppie univoche per <from_ip, to_ip> tupla - quindi, MySQL non sarà in grado di utilizzare quell'indice con tali confronti di intervalli.

A meno che tu non stia eseguendo una query che coinvolge entrambe le parti della tua chiave primaria, non avrà alcun effetto (beh, in realtà, anche MySQL la utilizzerà - quando la condizione di selezione usa sottoinsieme sinistro dell'indice composto , ma non è il tuo caso). Ad esempio, utilizzerà la chiave primaria:

-- @x and @y are derived from somewhere else
SELECT * FROM inetnum WHERE [email protected] && [email protected]

Nel tuo caso, la chiave composta potrebbe essere la chiave primaria, sì, ma l'unico vantaggio sarà quello di fornire unicità. Quindi, puoi lasciarlo così com'è o creare un id surrogato chiave primaria (sostituendo la chiave primaria corrente con UNIQUE vincolo).

Una delle possibili soluzioni per migliorare la situazione potrebbe essere:creare chiavi a colonna singola per from_ip e to_ip . Dal momento che sono numeri interi, c'è una buona possibilità per un'elevata cardinalità, che avranno gli indici di risultato. Tuttavia, MySQL può utilizzare un solo indice e, pertanto, perderai "metà" del confronto efficiente dell'intervallo. Inoltre, dovresti ricordare che se il confronto maggiore di (o minore di) influirà su troppe righe, MySQL lo farà non usare anche index (poiché, ovviamente, non ha senso perché ci sono troppe righe da selezionare).

E - sì, evita di usare le funzioni in WHERE clausola. Non sto dicendo che MySQL perderà sempre l'utilizzo dell'indice in questo caso (ma molto probabilmente lo perderà nella maggior parte dei casi), ma pensa al sovraccarico che causerà la chiamata di funzione. Anche se è piccolo, puoi sempre sbarazzartene passando il valore corretto, formato dalla tua applicazione.