Эй! Спецы по MySQL! помогите соптимайзить запрос!
Misha v.3 27.02.2003 21:32
:)
итак, прикрутил к sql.p статистику по подсчету времени выполнения запросов (спасибо Nexus-у) и взглянув на один из запросов в данном форуме несколько офигел :)
запрос:
SELECT MAX(dt_published) FROM forum_message WHERE forum_id = 1 AND is_published = 1
результаты explain:
table type possible_keys key key_len ref rows Extra
forum_message ALL ix_message_0,ix_forum_id 13875 where used
время выполнения > 100 ms :(
индексы есть по forum_id, is_published, dt_published
для примера... все запросы в форуме выполняются 350 ms (т.е. этот запрос - треть всего времени). учитывая тот факт, что этот запрос нужен лишь для того, чтобы показать максимальные даты для фильтра по датам я загрустил.
почему этот запрос работает долго тоже понятно: большинство сообщений имеет is_published = 1 и forum_id = 1, поэтому индексы фактически не используются.
в то-же самое время, если убрать из запроса WHERE, то он выполняется мгновенно (0.887 ms) т.к. сервер просто берет это максимальное значение и все.
в рамках данного форума я действительно могу просто выкинуть WHERE, или в качестве максимальной даты использовать результат ^date::now[], но в общем случае эту задачу мне очень хотелось-бы решить... создание составного индекса может и поможет решить эту проблему, только я не знаю как...
сделать индекс из datetime и int... и что он будет выбирать по max? в общем буду экспериментировать, а если у кого есть мысли - давайте их сюда ;)
- Эй! Спецы по MySQL! помогите соптимайзить запрос!, Misha v.3 [M] 27.02.2003 21:32