У меня есть (большая) таблица, по которой я делаю запрос, используя 3 поля в WHERE
.У одного из этих полей есть индекс (дата), и я ищу хиты за последние 3 месяца.Хотя этот запрос никогда не будет быстрым, по крайней мере, я надеюсь, что будет использоваться индекс на эту дату.
Это мой запрос:
SELECT id
FROM statsTable
WHERE 1
AND ip = 'ipgoeshere'
AND anotherstring = 'Quite a long string goes here, something like this or even longer'
AND `date` > DATE_ADD( NOW( ) , INTERVAL -3 MONTH )
И это объясняет:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE statsTable ALL date NULL NULL NULL 4833721 Using where; Using filesort
Это полное сканирование таблицы, число строк отключено из-за подсчета строк INNODB, я думаю, но это все из них. Это занимает около 30 секунд.
Если я форсирую индекс таким образом, я получаю ожидаемый результат:
SELECT id
FROM statsTable FORCE INDEX (date)
WHERE 1
AND ip = 'ipgoeshere'
AND anotherstring = 'Quite a long string goes here, something like this or even longer'
AND `date` > DATE_ADD( NOW( ) , INTERVAL -3 MONTH )
Опять объяснение:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE statsTable range date date 8 NULL 1120172 Using where
Теперь у нас «только» миллион результатов, но это делается «быстро» (например, 3 секунды вместо 30).
Таблица:
CREATE TABLE IF NOT EXISTS `statsTable` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`date` datetime NOT NULL,
`ip` varchar(15) NOT NULL,
`anotherstring` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `date` (`date`)
) ENGINE=InnoDB;
Странная вещь: у меня эта таблица работает и в другой базе данных (работает на другом сервере), и в этом случае используется индекс IS.Я не вижу, в чем может быть проблема здесь.Есть ли настройка, которую я пропустил?Или это может быть какая-то другая незначительная разница?Помимо различий, я не понимаю, почему в приведенном выше запросе не использовался ключ.
Я запустил OPTIMIZE TABLE
и, как предложил @DhruvPathak, ANALYZE TABLE
, но объяснение остается прежним.Я также попытался ALTER TABLE
, как предложил друг, перестроить индекс.Не повезло.