La idea es que si tienes 100.000 registros sería en efecto excesivamente lento compararlo con todos los registros.
Por eso hay que hacerlo a la inversa...
Creas unas tablas llamadas 'enero' febrero.. diciembre ...
cada mes cuenta con 2 (ó 4 y más campos según sea el caso)
los campos son Dia numérico y libre buleano
rellenas la tabla inicialmente con todos los registros propios del año o de la temporada...
registro paa cada tabla: en la tabla enero
dia 1 ... 31, al crearse se crean con el campo libre=true
para febrero: dia =1... 28 ídem
Ahora cuando vayas a hacer una reserva sólo tienes que hacer en mitabla=elmes el 'where' para usar la tabla del mes que se quiere hacer la reserva y en ese día elregistro=eldia and libre=true y si libre es true, acepta la entrada del registro y cambias el registro a false.
El tercer campo que te indicaba es para casos en los que se acepte un número máximo de reservas, por ejemplo si son camas de un albergue de montaña y tiene pongamos 7 camas, necesitarías un tercer campo que señalara camasExistentes y un 4º camas ocupadas, en ese caso podrías eliminar el campo 'libre' si cambiaras la sentencia por 'and camasOcupadas<camasExistentes'...
Resumiendo aunque tengas 100.000 registros sólo precisas mirar uno el del mes y día pedido... cuando esté libre se marca ocupado y cuando esté ocupado se deniega otra reserva para dicha fecha. Si el número de reservas posibles es mayor que uno, entonces haces el cambio que te anoté antes, y queda que mientras en ese mes y día las ocupadas sean menor que las existencias se acepta la reserva y se suma 1 a ocupadas al registro de ese día y si la ocupadas=existencias se deniega la reserva...
Un año solo tiene 365 días, o bien 12 meses con sus alrededor de 30 días, por tanto por muy mal que diseñaras tu sentencia nunca tendrías que buscar entre más de 365 registros indistintamente de que haya 1 millón de registros en la BD, pero de hecho sólo necesitas compararlo con un registro combinando campos....
Las fechas tienes que mirarlas como los 'productos', el género los clientes se introducen en su tabla correspondiente pero si un cliente compra 10 sacos de patatas, hay que actualizar el alamacen de acuerdo a las existencias, así en el caso de fechas, la fecha se 'agota' y debe marcarse...
Además debes fijarte que si hago una reserva nunca pueda hacer una reserva para ayer, ni para un día ya pasado, por tanto si el año marcado es el actual el mes no puede ser anterior al presente y si el mes seleccionado es el actual el día no puede ser menor que al actual ...