Я понимаю, что у вас есть отдельные индексы для полей, которые вы упоминаете. Возможно, вы захотите попробовать добавить составной индекс (он же индекс нескольких столбцов) на (latitude, longitude)
:
CREATE INDEX ix_foo_lat_lng ON foo (latitude, longitude);
Возможно, вы захотите запустить EXPLAIN
для вашего запроса, чтобы увидеть, какие индексы использует MySQL. Цитирование из MySQL Manual :: Как MySQL использует индексы :
Предположим, вы выполнили следующую инструкцию SELECT
:
mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
Если в столбцах col1
и col2
существует индекс из нескольких столбцов, соответствующие строки могут быть получены напрямую. Если в col1
и col2
существуют отдельные индексы, состоящие из одного столбца, оптимизатор попытается использовать оптимизацию слияния индексов *1022* или попытается найти наиболее ограничивающий индекс, решив, какой индекс найдет меньше строк, и используя этот индекс для извлечения строк.
Вас также может заинтересовать следующая презентация:
Автор описывает, как вы можете использовать Haversine Formula в MySQL для упорядочения по близости и ограничения ваших поисков до определенного диапазона. Он также описывает, как избежать полного сканирования таблицы для таких запросов, используя традиционные индексы для столбцов широты и долготы.
1 PDF версия