Não tenho certeza de como tudo funciona internamente, mas dependendo da situação, eu aconselho a brincar com uma mesa que 'desenvolva' todos os valores de d1 e depois junte-se a ela. Dessa forma, o mecanismo de consulta pode identificar o registro correto 'exatamente', em vez de ter que encontrar uma combinação de limites que correspondam ao valor que está sendo procurado.
por exemplo.
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..
dado um índice na coluna de valor (**), isso deve ser um pouco mais rápido do que unir com o início E o fim BETWEEN na tabela d1 original IMHO.
Claro, cada vez que você fizer alterações em d1, você precisará ajustar a tabela lançada também (gatilho?). Se isso acontecer com frequência, você gastará mais tempo atualizando a tabela lançada do que ganhou em primeiro lugar! Além disso, isso pode levar um pouco de espaço (em disco) rapidamente se alguns dos intervalos forem muito grandes; e também, isso pressupõe que não precisamos procurar por números não inteiros (por exemplo, e se procurarmos o valor 3,14 ?)
(Você pode experimentar um único em (valor, x) aqui...)