Текст запроса значения тоже не имеет - нужны данные о самих таблицах: размер, индексы, типы полей, по которым идут джойны.
Это целая аналитическая работа.
Смотри план выполнения
Всё зависит от конкретной задачи.
Одни статистики считаются сразу, если они выполняются редко и/или быстро.
Если статистика тяжело считается, но её актуальность суточная, то выбирается время наименьшей активности юзеров. У нас это 4 часа утра в текущем регионе (+ в выходные ещё меньше). В это время запускается и считается тяжёлая статистика. Результаты отправляются в отдельную таблицу, откуда эти данные потом быстро забираются. Либо сразу подготавливается html-страница с отчётом.
Примерно то же самое, если актуальность в несколько часов или минут.
100к строк в таблице - это вообще ни о чём. Крохотулечная табличка. Тут всё зависит от самого запроса, как он написан.
Конечно, Null - абсолютно правильно.
Во-первых, обрабатывать логику проще, а во-вторых, дата 00-00-0000 не имеет смысла и вообще это место для потенциальных ошибок
Я бы хранил дату в unixtime timestamp , то есть bigint или int. Проще обрабатывать, сортировать, делать пейджинг, работать с таймзонами, избегаем проблемы с локализацией, да и машина быстрее и охотнее работает с целыми числами. Перевод в string или datetime делал бы только при выводе данных.
Ответ не имеет значения без данных о нагрузке.
Если нагрузка никакая, то это вполне хороший запрос.
Если этот запрос выполняется долго, но к нему идут частые обращения,та данные там не меняются, то имеет смысл подготавливать выборку заранее, писать результат в отдельную таблицу и уже эти данные отдавать пользователям