Я использую Firebird и создал таблицу, которая называется EVENTS. Столбцы:
id (INT) | name (VARCHAR) | category (INT) | website (VARCHAR) | lat (DOUBLE) | lon (DOUBLE)
Теперь пользователь хочет искать события в определенном радиусе вокруг него, но вводит только две или три буквы своего родного города. Итак, у нас есть, скажем, 200 возможных городов с их широтой и долготой. Так что мой SQL-запрос выглядит так:
SELECT id FROM events WHERE ((lat BETWEEN 30.09 AND 30.12) AND (lon BETWEEN 40.78 AND 40.81)) OR ((lat BETWEEN 30.09 AND 30.12) AND (lon BETWEEN 40.78 AND 40.81)) OR ...
Таким образом, мы получаем 200 ограничений в предложении WHERE, и для получения результата требуется несколько секунд.
Я знаю, что запрос может выглядеть ужасно. Но являются ли многие ограничения действительно узким местом? Можно ли оптимизировать этот запрос?