странно работает индексы. За 1 день работают. За 4 дня не работают

wmaster

Новичок
странно работает индексы. За 1 день работают. За 4 дня не работают

EXPLAIN SELECT DATE_FORMAT(date_time, '%Y-%m-%d') as date_str .... FROM `cdata` WHERE date_time>='2007-1-27 00:00:00' AND date_time<='2007-01-30 23:59:59' GROUP BY date_str;
+-------+-------+---------------+------+---------+------+--------+-----------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+-------+---------------+------+---------+------+--------+-----------------------------+
| cdata | range | time | time | 8 | NULL | 881088 | where used; Using temporary |
+-------+-------+---------------+------+---------+------+--------+-----------------------------+
Работает


EXPLAIN SELECT DATE_FORMAT(date_time, '%Y-%m-%d') as date_str .... FROM `cdata` WHERE date_time>='2007-1-20 00:00:00' AND date_time<='2007-01-30 23:59:59' GROUP BY date_str;
+-------+------+---------------+------+---------+------+---------+-----------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+------+---------------+------+---------+------+---------+-----------------------------+
| cdata | ALL | time | NULL | NULL | NULL | 5763761 | where used; Using temporary |
+-------+------+---------------+------+---------+------+---------+-----------------------------+
НЕ Работает

Разница только в диапазоне значений.
Версия правда старенькая: 3.23.54

Есть у кого нибудь предположения причины такого поведения Майскла?
 

Апельсин

Оранжевое создание
дело не в диапазоне, а в том кол-ве значений которые удовлетворяют вашему условию:


Sometimes MySQL does not use an index, even if one is available. One circumstance under which this occurs is when the optimizer estimates that using the index would require MySQL to access a very large percentage of the rows in the table. (In this case, a table scan is likely to be much faster because it requires fewer seeks.)

http://dev.mysql.com/doc/refman/4.1/en/mysql-indexes.html
 

voituk

прозревший
Иногда оптимизатор MySQL решает что лучше выполнить полное сканирование таблиц, чем "перелапатить" индекс.
Насколько я знаю такое наблюдается если предположительное количество результирующих записей превосходит 20% от всего количества записей.
 

hermit_refined

Отшельник
но mysql в любом случае рекомендуется обновить. даже если это не поможет в данном конкретном случае.
 

wmaster

Новичок
Причем использование индекса дает результат за секуду где-то, а без индекса все затягиватеся на минуту. 60 раз - это не мало :(

Спасибо всем за ответы.

20 процентами там и не пахнет. :)
Там не более 6%.
Конечно буду обновлять. Думаю поможет :)
Еще раз спасибо!
 

hermit_refined

Отшельник
кстати, непонятно, какого рода данные выбираются, как часто и для чего, но секунда - это уже очень долго (да и данных у вас немало).
скорее всего, имеет смысл создать дополнительную таблицу, и раз в день её дополнять.
 

Апельсин

Оранжевое создание
> Там не более 6%.

в таком случае он должен использоваться, попробуйте перестроить индекс (REPAIR TABLE .. QUICK) и сделать OPTIMIZE.
Кроме того попробуйте добавить FORCE INDEX()
 
Сверху