Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: having и индексы
 
 автор: admiral   (03.08.2010 в 02:34)   письмо автору
 
 

Есть запрос
$sqlcount = mysql_query("SELECT `cdate`, COUNT(*) AS cnt FROM `stat_all` GROUP BY type WITH ROLLUP HAVING DATE_FORMAT(cdate,'%Y%m%d') = '".date("Ymd")."'");


Столбец cdate имеет индекс. Проделал план выполнения запроса, который показал что в запросе нет ни одного возможного индекса, как я понял Mysql в данном запросе не использует индексов.
Это особенность HAVING или я делаю что-то не так?

  Ответить  
 
 автор: sms-send   (03.08.2010 в 05:24)   письмо автору
 
   для: admiral   (03.08.2010 в 02:34)
 

0) Индекс - это не чудо и его наличие в принципе ничего не даёт, нужно понимать в каких ситуациях mysql сможет его использовать.

0.5) Запрос в трёх местах не имеет смысла:
Во-первых и во-вторых, после группировки по полю `type`, поле `cdate` имеет множество значений в каждой группе и употреблять его в явном виде без агрегатной функции нельзя.
Во-третьих, ряд с итогами отличается от остальных тем, что содержит NULL в группируемом поле `type`, вы это поле не выбираете, а значит и извлечь этот ряд (отличить от остальных) в приложении не сможете.

1) HAVING применяется чтобы отфильтровать выборку, например, по вычисленному в запросе значению агрегатной функции. А когда выбираемые значения можно анализировать ещё на этапе выборки из таблицы, нужно помещать соответствующее условие в секцию WHERE. У вас значения агрегатных функций в условии не используется, значит и HAVING тут совсем не нужен.

2) Выражение вида ФУНКЦИЯ(`индексированное поле`) никогда не будет использовать индекс на `индексированное поле`. Индекс может быть использован, только если поле в явном виде сравнивается с константой (либо с выражением, приводящемся к константе для всего запроса). Подскажите, где вы взяли этот пример с выборкой по DATE_FORMAT, очень часто вижу люди используют, но не пойму откуда берут что "так и надо".

  Ответить  
 
 автор: admiral   (03.08.2010 в 06:24)   письмо автору
 
   для: sms-send   (03.08.2010 в 05:24)
 

Честно, не помню где взял, но понимаю что этот запрос не имеет право на использование в реальных проектах. Собственно мне нужно выбрать записи за текущие сутки.
Поле cdate имеет тип DATETIME. Я так понимаю правильно будет убрать having и использовать INTERVAL в секции where?

  Ответить  
 
 автор: admiral   (04.08.2010 в 08:59)   письмо автору
 
   для: sms-send   (03.08.2010 в 05:24)
 

Вообщем после долго изучения документации я пришел к такому запросу, на мой взгляд лучше придумать нельзя, хотя могу ошибаться.
SELECT COUNT(*) AS cnt 
FROM tbl
WHERE cdate BETWEEN STR_TO_DATE('2010-08-04 00:00:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2010-08-04 23:59:59', '%Y-%m-%d %H:%i:%s')
GROUP BY `type`

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования