Zapewne obliczając datę ręcznie by "skorzystał z indeksu"?
Tylko że klauzule WHERE są parsowane przed jakąkolwiek optymalizacją, a wyrażenie
now() - INTERVAL 2 HOUR
ma ściśle określoną wartość zanim dojdzie do próby wyboru indeksu.
Prawie nie różni się więc od gotowej daty dostarczonej przez php.
Tzn różni się tylko tym, że wymagany jest dodatkowy język programowania.
Przykładowa testowa baza danych:
CREATE TABLE IF NOT EXISTS `test`.`daty` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`kiedy` DATETIME NOT NULL
) ENGINE = MYISAM ;
ALTER TABLE `daty` ADD INDEX ( `kiedy` ) ;
INSERT INTO `test`.`daty` ( `kiedy` ) VALUES ( NOW( ) - INTERVAL 3 HOUR );
INSERT INTO `test`.`daty` ( `kiedy` ) VALUES ( NOW( ) );
Zobaczmy więc co nam powie explain:
EXPLAIN SELECT * FROM `daty` WHERE `kiedy` > NOW( ) - INTERVAL 2 HOUR
Possible keys: kiedy
Key: kiedy
Zatem
Cytat(wookieb @ 15.04.2011, 17:31:10 )

Ale nigdy nie skorzysta z indeksu tabeli nawet jeżeli istnieje + nie skorzysta z cache.
jest zwykłym wprowadzaniem ludzi w błąd.