|
|
|
| Есть запрос
$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 или я делаю что-то не так? | |
|
|
|
|
|
|
|
для: admiral
(03.08.2010 в 02:34)
| | 0) Индекс - это не чудо и его наличие в принципе ничего не даёт, нужно понимать в каких ситуациях mysql сможет его использовать.
0.5) Запрос в трёх местах не имеет смысла:
Во-первых и во-вторых, после группировки по полю `type`, поле `cdate` имеет множество значений в каждой группе и употреблять его в явном виде без агрегатной функции нельзя.
Во-третьих, ряд с итогами отличается от остальных тем, что содержит NULL в группируемом поле `type`, вы это поле не выбираете, а значит и извлечь этот ряд (отличить от остальных) в приложении не сможете.
1) HAVING применяется чтобы отфильтровать выборку, например, по вычисленному в запросе значению агрегатной функции. А когда выбираемые значения можно анализировать ещё на этапе выборки из таблицы, нужно помещать соответствующее условие в секцию WHERE. У вас значения агрегатных функций в условии не используется, значит и HAVING тут совсем не нужен.
2) Выражение вида ФУНКЦИЯ(`индексированное поле`) никогда не будет использовать индекс на `индексированное поле`. Индекс может быть использован, только если поле в явном виде сравнивается с константой (либо с выражением, приводящемся к константе для всего запроса). Подскажите, где вы взяли этот пример с выборкой по DATE_FORMAT, очень часто вижу люди используют, но не пойму откуда берут что "так и надо". | |
|
|
|
|
|
|
|
для: sms-send
(03.08.2010 в 05:24)
| | Честно, не помню где взял, но понимаю что этот запрос не имеет право на использование в реальных проектах. Собственно мне нужно выбрать записи за текущие сутки.
Поле cdate имеет тип DATETIME. Я так понимаю правильно будет убрать having и использовать INTERVAL в секции where? | |
|
|
|
|
|
|
|
для: 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`
|
| |
|
|
|