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

Unione efficiente su intervalli di intervalli in SQL

Non sono sicuro di come funzioni tutto internamente, ma a seconda della situazione, consiglierei di giocare con un tavolo che "spinga" tutti i valori da d1 e poi si unisca a quello. In questo modo il motore di query può individuare il record corretto "esattamente" invece di dover trovare una combinazione di limiti che corrispondano al valore cercato.

es.

x value
a  1
a  2
a  3
b  5
b  6
b  7
b  8
b  9
b 10
b 11
c 19 etc..

dato un indice sulla colonna del valore (**), questo dovrebbe essere un po' più veloce dell'unione con BETWEEN start AND end sulla tabella d1 originale IMHO.

Ovviamente, ogni volta che apporti modifiche a d1, dovrai regolare anche la tabella spiegata (trigger?). Se ciò accade frequentemente, trascorrerai più tempo ad aggiornare il tavolo implementato di quello che hai guadagnato in primo luogo! Inoltre, questo potrebbe richiedere un bel po' di spazio (disco) rapidamente se alcuni degli intervalli sono davvero grandi; e inoltre, questo presuppone che non sia necessario cercare numeri non interi (ad esempio cosa succede se cerchiamo il valore 3.14?)

(Potresti considerare di sperimentarne uno univoco su (valore, x) qui...)