Nie jestem pewien, jak to wszystko działa wewnętrznie, ale w zależności od sytuacji radziłbym pobawić się stołem, który „rozwija” wszystkie wartości z d1, a następnie dołączyć do tego. W ten sposób silnik zapytań może „dokładnie” wskazać właściwy rekord, zamiast szukać kombinacji granic, które pasują do szukanej wartości.
np.
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..
biorąc pod uwagę indeks w kolumnie wartości (**), powinno to być nieco szybsze niż łączenie z BETWEEN start AND end w oryginalnej tabeli d1 IMHO.
Oczywiście, za każdym razem, gdy wprowadzasz zmiany w d1, musisz również dostosować rozwinięty stół (wyzwalacz?). Jeśli zdarza się to często, spędzisz więcej czasu na aktualizowaniu rozwiniętej tabeli, niż uzyskałeś na początku! Dodatkowo może to szybko zająć sporo miejsca (na dysku), jeśli niektóre interwały są naprawdę duże; a także zakłada, że nie musimy szukać liczb niecałkowitych (np. co, jeśli szukamy wartości 3,14 ?)
(Możesz rozważyć poeksperymentowanie z unikalnym na (wartość, x) tutaj...)