LINUX.ORG.RU

оптимизация sql-запроса - выборка по дате


0

0

Статистика посещаемости сайта. Перпендикулярные таблицы - визиты (хиты), пользователи (унифицируются по id сессии визита), браузеры (по user-agent)

Соответственно запрос (mysql v4.1)

SELECT
  b.browser_id as 'browser_id',
  b.name as 'name',
  COUNT(*) as 'count'
FROM stat_visits AS v
  LEFT JOIN stat_users AS u USING (user_id)
  LEFT JOIN stat_browsers AS b USING (browser_id)
WHERE 1
  AND u.browser_id!=0
  AND b.spider=0
  AND (YEAR(v.date) = 2007) AND (MONTH(v.date) = 8) AND (DAYOFMONTH(v.date) = 6)
GROUP BY b.browser_id
ORDER BY 'count' DESC


explain по нему выдает следущее:

1	SIMPLE	v	ALL	NULL	NULL	NULL	NULL	113972	Using where; Using temporary; Using filesort
1	SIMPLE	u	eq_ref	PRIMARY	PRIMARY	4	hitroe.v.user_id	1	Using where
1	SIMPLE	b	eq_ref	PRIMARY,spider	PRIMARY	4	hitroe.u.browser_id	1	Using where


Т.е. перебирает полностью таблицу визитов (в ней именно 113 тыщ записей). 

Есть ли возможность оптимизировать выборку? Не хочется вводить в таблице дополнительные поля вида "год", "месяц" и "день" вместо одного поля "дата". 
★★★★★

З.Ы. Интересует именно принципиальный подход к решению такой задачи (выборки по дате), а не обходные решения.

Упрощенный запрос типа

explain SELECT * FROM stat_visits AS v WHERE 1 AND (YEAR(v.date) = 2007) AND (MONTH(v.date) = 8) AND (DAYOFMONTH(v.date) = 6)

выдает аналогичную фигню - 113 тыщ переборов.

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от gods-little-toy

принципиальный подход - сравнивать не значения функций, а сами DATE[TIME] поля. Операторы = > < >= BETWEEN и тд для них работают.

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

Да, чё-т я ступил... Третий день в глубокой отладке.

Спасибо!

AngryElf ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.