Xpoint
   [напомнить пароль]

Запрос без "GROUP BY" или как его оптимизировать?

Метки: [без меток]
2010-10-19 16:55:06 [обр] Раиль[досье]

Добрый день. Есть запрос в базу данных вида:

SELECT count(*) FROM `apache_log` WHERE id_date = 122 (0.0007 сек.)

Он выводит количество IP-адресов, за дату id_date.

Небольшое пояснение к таблицам.
 apache_log.is_page => BOOLEAN
 apache_log.id_date => INT (проиндексировано и связано с dates.id_date)
 dates.id_date => INT (первичный ключ)
 dates.date => DATE(уникальный индекс)

Необходимо его привести к виду:

SELECT COUNT(*)
FROM apache_log
WHERE id_date
IN (
    SELECT id_date
    FROM dates
    ORDER BY date DESC
)
GROUP BY id_date
LIMIT 10
(0.0173 сек.)

GROUP BY очень сильно тормозит запрос(без него тоже 0,0006 приблизительно уходит на запрос, но результат не тот что нужен)). Подскажите пожалуйста каким образом можно сделать запрос быстрым, как быть с GROUP BY? Как его индексируют, либо обходятся без него? Желательно на моем примере.

P.S.: в IN запросе у нас выделяется сразу вся таблица с dates, на моем примере она весит не много и проиндексирована хорошо, но в идеале нужно же брать 10 записей? Опять же LIMIT 10 не работает во вложенном запросе.

Надеюсь достаточно сведений дал о структуре базы данных.

Если бы разобрался с этим запросом жизнь на время стала бы прекрасней. Всем спасибо большое, надеюсь на вашу помощь, так понравился форум, в поисковиках регулярно на вас захожу :)

спустя 28 минут [обр] Евгений Седов aka KPbIC(0/187)[досье]
SELECT id_date, count(*) FROM apache_log GROUP BY id_date ORDER BY id_date DESC LIMIT 10;
спустя 31 минуту [обр] Раиль[досье]

А ведь забыл написать: в базе пока только 40K записей, это "нагрузочка" уже, а вот если будет 4KK... На практике highload сайты например...

Ммм, к такому запросу как у Евгений Седов aka KPbIC я уже приходил. Видать я хочу сделать невозможного) Хотя этот сверхбыстрый(~0.0005 хотелось бы) запрос мне сейчас нужен только в учебных целях. Возможно там необходимо делать другую структуру базы данных.

Ну а как еще??? Как машина уберет лишнее и вытащит сумму количества определенного поля? Можно первым моим запросом:

SELECT count(*) FROM `apache_log` WHERE id_date = 122 (0.0007 сек.)

Подставив нужный id_date через интерфейс СУБД как переменную запроса. Мне ведь нужно всего 10 записей. Соответственно 0.0007 * 10 = 0.007 - еще нужно учитывать работу по вытаскиванию dates.id_date, да и в цикле выводить по одной строке - издевательство. Вывод: будет не намного быстрее.

спустя 2 минуты [обр] Евгений Седов aka KPbIC(0/187)[досье]
Поставьте индекс на apache_log.id_date.
спустя 25 минут [обр] Раиль[досье]
Ну он и так стоит. Я же писал сверху
спустя 50 минут [обр] Алексей Севрюков(7/1292)[досье]
Раиль[досье] как вы меряете скорость выполнения запроса? Запускаете один запрос и смотрите время выполнения в консоли или в phpMyAdmin?
спустя 1 час 49 минут [обр] Thirteensmay(0/157)[досье]
Убрать ORDER BY из подзапроса, он там по всему набору, тормоза, а толку не вижу, если результат должен быть отсортирован то используйте ORDER BY в основном запросе. В подзапросе укажите WHERE DATE BETWEEN Date1 AND Date2 для указания необходимых вам 10 дат. При этом если в логе на какую то из дат не будет записей то в результате окажется 9 строк, если критично именно 10 то вместо подзапроса JOIN.
спустя 19 минут [обр] Раиль[досье]
В phpMyAdmin, но там после установки индекса заметил что первые результаты немного дольше выполняется...
спустя 2 часа 18 минут [обр] Алексей Севрюков(7/1292)[досье]
Не стоит так сильно верить этим цифрам. Для полноценной проверки производительности разовых запуском недостаточно.
спустя 1 час 37 минут [обр] Раиль[досье]
Да нет нормально все. У меня класс для работы с базой данных, в нем можно запустить тест скорости выполнения запросов. И каждый запрос на странице выполняется определенное количество раз.
спустя 46 секунд [обр] Раиль[досье]
Всем спасибо за внимание и помощь:)
спустя 11 часов [обр] Алексей Севрюков(7/1292)[досье]
"Нормально все" это миф. Тестирование скорости выполнения программного кода это совсем не так просто, как вы рассказываете. Дело, конечно, ваше.
Я лишь предупреждаю что тестируете Вы неправильно.
Powered by POEM™ Engine Copyright © 2002-2005