Возможно ли оптимизировать запрос?

Vadimka

Новичок
Возможно ли оптимизировать запрос?

Имеется таблица логов с полями:
id_kto - mediumint(9)
dd - timestamp
и др. поля
записей в таблице - 1,235,622
тип таблицы - MyISAM

есть запрос:
SELECT DATE_FORMAT(dd,'%Y-%m-%d') AS dd, count(*) AS v_ban6, id_kto
FROM stat_view
WHERE id_kto='6' AND dd >= '2008-12-07 00:00:00' GROUP BY 1

который выполняется более 2 секунд, возможно ли оптимизировать запрос, т.к. кол-во записей будет увеличиваться и время на выполнение большое :(
п.с. при выборке используется ключ по: id_kto+click+dd
 

Wicked

Новичок
1) безотносительно производительности: DATE_FORMAT(dd,'%Y-%m-%d') === DATE(dd)
2) покажи explain этого запроса
3) скорее всего нужна некоторая денормалиация: отдельное поле dd_date === DATE(dd) и индекс по (id_kto, dd_date)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
PHP:
mysql> SELECT benchmark(1235622, DATE_FORMAT('20081010000000', '%Y-%m-%d'));
+---------------------------------------------------------------+
| benchmark(1235622, DATE_FORMAT('20081010000000', '%Y-%m-%d')) |
+---------------------------------------------------------------+
|                                                             0 |
+---------------------------------------------------------------+
1 row in set (0.92 sec)
 

Vadimka

Новичок
Автор оригинала: Mr_Max
PHP:
mysql> SELECT benchmark(1235622, DATE_FORMAT('20081010000000', '%Y-%m-%d'));
+---------------------------------------------------------------+
| benchmark(1235622, DATE_FORMAT('20081010000000', '%Y-%m-%d')) |
+---------------------------------------------------------------+
|                                                             0 |
+---------------------------------------------------------------+
1 row in set (0.92 sec)
вижу DATE_FORMAT подтормаживает :(
PHP:
mysql> SELECT benchmark( 1235622, DATE_FORMAT( '2008-10-10 00:00:00', '%Y-%m-%d' ) ) ; 
+------------------------------------------------------------------------+
| benchmark( 1235622, DATE_FORMAT( '2008-10-10 00:00:00', '%Y-%m-%d' ) )
| +------------------------------------------------------------------------+
|                                                                      0 
| +------------------------------------------------------------------------+ 
1 row in set (0.67 sec)  

mysql> SELECT benchmark( 1235622, LEFT( '2008-10-10 00:00:00', 10 ) ) ; 
+---------------------------------------------------------+ 
| benchmark( 1235622, LEFT( '2008-10-10 00:00:00', 10 ) )
| +---------------------------------------------------------+ 
|                                                       0 
| +---------------------------------------------------------+ 
1 row in set (0.05 sec)
попробую добавить новое поле c типом DATE...

-~{}~ 08.12.08 20:12:

Автор оригинала: Wicked
3) скорее всего нужна некоторая денормалиация: отдельное поле dd_date === DATE(dd) и индекс по (id_kto, dd_date)
Отдельное поле сделало свое дело :)
Спасибо за подсказку!
 
Сверху