Не відповідь MySql, але це покращить продуктивність вашої операції sql.
Те, що ви ефективно робите, - це обчислити відстань до кожної точки таблиці, щоб побачити, чи знаходиться вона в межах 10 одиниць даної точки.
Що ви можете зробити перед тим, як запустити цей sql, це створити чотири точки, які намалюють коробку з 20 одиницями збоку, з точкою в центрі, тобто. (x1, y1). . . (x4, y4), де (x1, y1) є (дається тривалість + 10 одиниць, задана лат + 10 одиниць). . . (Дана Довга - 10 Одиниць, ДанаЛітка -10 одиниць).
Насправді, вам потрібно лише дві точки, зверху ліворуч і праворуч зверніть їх (X1, Y1) та (X2, Y2)
Тепер ваш оператор SQL використовує ці точки, щоб виключити рядки, які, безумовно, перевищують 10u від вашої заданої точки, він може використовувати індекси широт і довжин, тому буде на порядок швидше, ніж у вас зараз.
напр
select . . .
where locations.lat between X1 and X2
and locations.Long between y1 and y2;
Підхід коробки може повернути помилкові позитиви (ви можете забрати точки в кутах поля, які> 10u від даної точки), тому вам все одно потрібно обчислити відстань кожної точки. Однак це знову буде набагато швидше, оскільки ви різко обмежили кількість балів для тестування до балів у полі.
Я називаю цю техніку "Мислення всередині коробки" :)
EDIT: Чи можна це помістити в один оператор SQL?
Я поняття не маю, на що здатний mySql або Php, вибачте. Я не знаю, де найкраще місце для побудови чотирьох точок, або як їх можна передати на запит mySql в Php. Однак, як тільки у вас є чотири точки, ніщо не зупинить вас, поєднуючи свій власний оператор SQL з моїм.
select name,
( 3959 * acos( cos( radians(42.290763) )
* cos( radians( locations.lat ) )
* cos( radians( locations.lng ) - radians(-71.35368) )
+ sin( radians(42.290763) )
* sin( radians( locations.lat ) ) ) ) AS distance
from locations
where active = 1
and locations.lat between X1 and X2
and locations.Long between y1 and y2
having distance < 10 ORDER BY distance;
Я знаю, що за допомогою MS SQL я можу створити оператор SQL, який оголошує чотири поплавці (X1, Y1, X2, Y2) і обчислює їх перед "головним" оператором select, як я вже сказав, я не маю уявлення, чи можна це зробити за допомогою MySql. Однак я все-таки схильний будувати чотири точки в C # і передавати їх у якості параметрів SQL-запиту.
Вибачте, я не можу більше допомогти, якщо хтось може відповісти на конкретні частини MySQL & Php, сміливо відредагуйте цю відповідь, щоб це зробити.