Я пытаюсь получить список, который не существует во второй таблице. Я видел различные Q&А и блог. Большинство из них предложили НЕ ВСТРЕЧАТЬСЯ. Поскольку мне нужно настроить фильтр для второй таблицы, я предпочел NOT IN с подзапросом. Моя вторая таблица содержит более 10 миллионов строк. Я пытаюсь следующий запрос
SELECT DISTINCT t1.username, t1.column2, t1.column3, t1.column4, t1.column5
FROM table1 t1
WHERE t1.username NOT IN (
SELECT DISTINCT t2.username
FROM table2 t2
WHERE timestamp >= ". $activityDate ."AND timestamp < ( DATE_ADD( ". $activityDate ." , INTERVAL 24 HOUR ) )
)
AND t1.column2 = 'Dhaka' AND t1.column3 <> 'India'
GROUP BY t1.username
ORDER BY t1.username DESC
Иногда это показывает #2004 Server has gone away
ошибка.
Есть ли способ ускорить результат для более быстрого ответа?
SELECT DISTINCT t1.username, t1.column2, t1.column3, t1.column4, t1.column5
FROM table1 t1
LEFT JOIN table2 t2
ON t1.username = t2.username
AND t2.timestamp BETWEEN " . $startDate .
" AND " . $endDate . "WHERE t2.username IS NULL
...
Убедитесь, что столбцы username и timestamp проиндексированы.
Precalculate enddate, нет необходимости заставлять сервер SQL делать это
Ваш второй SELECT DISTINCT
не требуется, и в зависимости от данных может быть много работы. Но я думаю, что настоящая проблема заключается в оценке отметки времени Через 24 часа снова и снова.
DATE_ADD( ". $activityDate .", INTERVAL 24 HOUR )
Если у вас нет умной базы данных, эта функция должна запускаться один раз в каждой строке. Можете ли вы рассчитать метку времени вне запроса?