NOT IN Выполнение слишком медленное с 10M + строками во второй таблице

Я пытаюсь получить список, который не существует во второй таблице. Я видел различные 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 ошибка.

Есть ли способ ускорить результат для более быстрого ответа?

-1

Решение

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 делать это

1

Другие решения

Ваш второй SELECT DISTINCT не требуется, и в зависимости от данных может быть много работы. Но я думаю, что настоящая проблема заключается в оценке отметки времени Через 24 часа снова и снова.

DATE_ADD( ". $activityDate .", INTERVAL 24 HOUR )

Если у вас нет умной базы данных, эта функция должна запускаться один раз в каждой строке. Можете ли вы рассчитать метку времени вне запроса?

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector