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

Ricerca efficiente in una tabella di intervallo

Dato che hai già un indice su ip_start , ecco come usarlo al meglio, supponendo che tu voglia effettuare un accesso per IP (1234 in questo esempio):

select organization from (
    select ip_end, organization
    from iptable
    where ip_start <= 1234
    order by ip_start desc
    limit 1
) subqry where 1234 <= ip_end

Questo utilizzerà il tuo indice per avviare una scansione che si interrompe immediatamente a causa del limit 1 . Il costo dovrebbe essere solo marginalmente superiore a quello di un semplice accesso indicizzato. Naturalmente, questa tecnica si basa sul fatto che gli intervalli definiti da ip_start e ip_end mai sovrapporre.

Il problema con il tuo approccio originale è che mysql, non essendo a conoscenza di questo vincolo, può utilizzare l'indice solo per determinare dove avviare o interrompere la scansione di cui (pensa) ha bisogno per trovare tutte le corrispondenze per la tua query.