Не используется индекс на поле datetime

idencial

Одинаковый
Не используется индекс на поле datetime

Есть таблица

PHP:
CREATE TABLE `page_stat_main` (
  `section_id` tinyint(3) NOT NULL default '0',
  `main_id` mediumint(6) unsigned NOT NULL default '0',
  `url` tinytext NOT NULL,
  `datetime` datetime NOT NULL default '0000-00-00 00:00:00',
  `ip` bigint(20) NOT NULL default '0',
  `referer` tinytext NOT NULL,
  `stat_cookies` varchar(10) NOT NULL default '',
  KEY `section_id` (`section_id`),
  KEY `main_id` (`main_id`),
  KEY `datetime` (`datetime`)
)
Делаю запрос

PHP:
explain select * from page_stat_main where datetime > '2005-09-14 00:00:01'
Выдает
PHP:
table            type    possible_keys  key key_len ref rows Extra 
page_stat_main   ALL     datetime                      401280 Using where
В таблице 401280, т.е он просматривает все и не использует индекс

С чем это может быть связано?
 

camka

не самка
Попробуй запустить CHECK|ANALYZE TABLE page_stat_main. Может быть распределение ключей наладится и оптимизатор осознает свою ошибку.
 

antson

Новичок
Партнер клуба
Плохо использовать в качестве имен полей зарегистрированные слова .
попробуй дать другое имя.
 

idencial

Одинаковый
Плохо использовать в качестве имен полей зарегистрированные слова .
попробуй дать другое имя.
Я понимаю, что плохо, но то, что сейчас работает переделывать очень проблеммно, дать другое имя сейчас нереально.

-~{}~ 22.09.05 13:04:

Попробуй запустить CHECK|ANALYZE TABLE page_stat_main. Может быть распределение ключей наладится и оптимизатор осознает свою ошибку
К сожалению оптимизатор не осознал ошибку :(
 

camka

не самка
Потыркайся на предмет того, что скажет EXPLAIN, если период времени уменьшить - количество рядов в результате запроса снизить до малого числа - 100, 200. Попробуй условие с равенством. Как поведет себя EXPLAIN в этих случаях. Если не спасет, можно попробовать удалить индекс и создать заново.

По совету атсона можно взять все имена полей в кавычки `datetime`.
 

Апельсин

Оранжевое создание
idencial, а если ты исключишь поле, которые tinytext из выборки и перечислишь все остальные поля?

кстати, а какая версия?
 

idencial

Одинаковый
PHP:
explain select datetime, section_id, main_id, ip, referer, stat_cookies from page_stat_main where datetime > '2005-09-14 00:00:01'
Результат прежний
PHP:
explain select datetime from page_stat_main where datetime > '2005-09-14 00:00:01'
А вот здесь он использует индекс

Версия MySQL 4.0.15a

-~{}~ 22.09.05 18:26:

И что самое интересное, если сократить количество рядов, то он действительно начинает использовать индекс
PHP:
explain select * from page_stat_main where datetime > '2005-09-20 00:00:01'

table type possible_keys key key_len ref rows Extra 
page_stat_main range datetime datetime 8  64836 Using where
а если
PHP:
explain select * from page_stat_main where datetime > '2005-09-19 00:00:01'

table type possible_keys key key_len ref rows Extra 
page_stat_main ALL datetime    388545 Using where
Т.е индекс используется если количество возвращаемых рядов, скажем 64836
Если он возрастает до 388545, то индекс уже не используется
 

camka

не самка
Если он возрастает до 388545, то индекс уже не используется
Дак и не должно. Читай мануал. Там про это написано.

Результат прежний
забыл referer исключить. Он тоже tinytext.
Попробуй преобразовать в varchar все tinytext. Может прокатит.
 

idencial

Одинаковый
стоп, я тормознул
PHP:
select count(*) from page_stat_main where datetime > '2005-09-19 00:00:01'
Количество - 35948
PHP:
select count(*) from page_stat_main where datetime > '2005-09-20 00:00:01'
Количество - 21349

Т.е при возрастании с 21349 до 35948 индекс перестает использоваться

388545 - это общее количество записей в таблице

забыл referer исключить. Он тоже tinytext.
Исключал, не помогает, дело врдяли в нем
 

FiW

Новичок
idencial
а как насчет принудительного использования определенного индекса?
 
Сверху