sesach : ( 3959 * acos( cos( radians('.$_REQUEST['latitude'].') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$_REQUEST['longitude'].') ) + sin( radians('.$_REQUEST['latitude'].') ) * sin( radians( latitude ) ) ) ) <='.$_REQUEST['mile'];
Можете ли вы попробовать это: 1. Создайте индекс для обеих таблиц в столбце id, если он еще не создан (это займет время).
Query 1 - insert into log_1_tmp select * from log_1 where log_1.ip = '192.168.100.100'
Query 2 - insert into log_2_tmp select * from log_2 where log_2.ip = '192.168.100.100'
Посмотрите, работает ли это.
Прежде всего, ваше текущее предложение LIMIT
довольно бессмысленно, поскольку в запросе нет предложения ORDER BY
. Не ясно , какие 100 записей вы хотите сохранить. Итак, вы можете использовать что-то вроде этого:
SELECT
l1.datetime,
l1.id,
l1.name,
l1.ip,
l2.datetime,
l2.mobile,
l2.id
FROM log_1 l1
INNER JOIN log_2 l2
ON l1.id = l2.id AND l1.datetime = l2.datetime
WHERE
l1.ip = '192.168.100.100'
ORDER BY
l1.datetime DESC
LIMIT 100;
Это вернет 100 самых последних совпадающих записей. Что касается ускорения этого запроса, один из способов как минимум ускорить объединение - добавить следующий индекс в таблицу log_2
:
CREATE INDEX idx ON log_2 (datetime, id, mobile);
Предполагая, что MySQL выберет этот индекс, он должен сделать объединение происходит намного быстрее, потому что каждое значение id
и datetime
можно искать в B-дереве, а не выполнять ручное сканирование всей таблицы. Обратите внимание, что индекс также охватывает столбец mobile
, который необходим для выбора.