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

  • Автор темы Автор темы wmaster
  • Дата начала Дата начала

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
 
Иногда оптимизатор MySQL решает что лучше выполнить полное сканирование таблиц, чем "перелапатить" индекс.
Насколько я знаю такое наблюдается если предположительное количество результирующих записей превосходит 20% от всего количества записей.
 
но mysql в любом случае рекомендуется обновить. даже если это не поможет в данном конкретном случае.
 
Причем использование индекса дает результат за секуду где-то, а без индекса все затягиватеся на минуту. 60 раз - это не мало :(

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

20 процентами там и не пахнет. :)
Там не более 6%.
Конечно буду обновлять. Думаю поможет :)
Еще раз спасибо!
 
кстати, непонятно, какого рода данные выбираются, как часто и для чего, но секунда - это уже очень долго (да и данных у вас немало).
скорее всего, имеет смысл создать дополнительную таблицу, и раз в день её дополнять.
 
> Там не более 6%.

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