У меня была похожая задача, только хотелось отслеживать изменения страниц для себя: скидки в фитнес-клубе, акции на ТО в автосервисе и прочее. Не найдя толковых альтернатив, сделал на коленке эфпячку. Она ещё в глубокой альфе, но уже неплохо справляется со своей задачей.
Конечно вы правы! Мой запрос далек от оптимальности. Раскрою секрет: в посте я немного слукавил.
Задача: «Необходимо посчитать количество пользователей, которые хотя бы раз писали на форум в течение дня за последний месяц» была придумана для демонстрации этого конкретного запроса. На самом мне было необходимо сделать конструктор, который выдает аналитику по предварительно обработанным данным. В простом случае это: «фильтрануть уникальных пользователей за день». Но душа маркетолога крайне многогранна: завтра это может быть «пользователи у которых больше 5 постов за день», а послезавтра — «пользователи у которых от 2 до 5 постов, которые зарегистрировались более месяца назад, но у них до сих пор не заполнен профиль». В связи с этим я решил разбить задачу на два этапа: сначала фильтруем данные, потом считаем по ним аналитику. С помощью подзапроса данная задача решается наиболее просто. Но, к сожалению, не оптимально.
Ну и самое главное: пост не о том, как решить конкретную задачу лучше всего, а о том, как затейливо работают оптимизаторы MySQL и MariaDB выполняя данный конкретный запрос.
Ну вы опять за свое :) Есть конкретный запрос, который я привел в посте. В нем джойн не нужен. С этим я согласен.
Есть класс запросов с подзапросами, которые можно преобразовать в джойн. И их лучше преобразовать к джойну, пока оптимизаторы СУБД не поумнеют.
Ваш коммент «Корректней и от JOIN отказаться» показался мне призывом отказаться от джойнов вообще. Все чаще вижу людей, которые очень любят к этому призывать и недоумеваю по этому поводу.
Ага! Все верно. В нашей системе правда фильтрация таблицы бывает куда сложнее, поэтому было решено использовать подзапрос. Хотя ваш запрос куда оптимальнее.
Да! Именно об этом и пост: оптимизатор MySQL ведет довольно странно.
На mysqlperformanceblog ещё в 2010 году писали, что в версии 6.0 оптимизатор заточат под такие запросы.
Задача: «Необходимо посчитать количество пользователей, которые хотя бы раз писали на форум в течение дня за последний месяц» была придумана для демонстрации этого конкретного запроса. На самом мне было необходимо сделать конструктор, который выдает аналитику по предварительно обработанным данным. В простом случае это: «фильтрануть уникальных пользователей за день». Но душа маркетолога крайне многогранна: завтра это может быть «пользователи у которых больше 5 постов за день», а послезавтра — «пользователи у которых от 2 до 5 постов, которые зарегистрировались более месяца назад, но у них до сих пор не заполнен профиль». В связи с этим я решил разбить задачу на два этапа: сначала фильтруем данные, потом считаем по ним аналитику. С помощью подзапроса данная задача решается наиболее просто. Но, к сожалению, не оптимально.
Ну и самое главное: пост не о том, как решить конкретную задачу лучше всего, а о том, как затейливо работают оптимизаторы MySQL и MariaDB выполняя данный конкретный запрос.
Есть класс запросов с подзапросами, которые можно преобразовать в джойн. И их лучше преобразовать к джойну, пока оптимизаторы СУБД не поумнеют.
Ваш коммент «Корректней и от JOIN отказаться» показался мне призывом отказаться от джойнов вообще. Все чаще вижу людей, которые очень любят к этому призывать и недоумеваю по этому поводу.
JOIN
всем хорош. Но не любойJOIN
легко сделать, когда ты используешь ORM.MySQL отрабатывает правильно, но тормозит на большом наборе данных.
Отличная идея!
2013-01-01 5
2013-01-02 4
На mysqlperformanceblog ещё в 2010 году писали, что в версии 6.0 оптимизатор заточат под такие запросы.
MIN(fp2.id)
. Суть же просто в фильтрации таблицы, чтобы дата и пользователь были уникальными.Я удивляюсь не двум записям, а числам 10 и 8. Должно быть 5 и 4.
Спасибо!