В последние дни я заметил что-то странное, оптимизирующее мой запрос. У меня есть простой запрос, который делает что-то вроде:
SELECT id,name,amount FROM reservations WHERE NOT canceled ORDER BY name ASC
Я заметил, что mysql не использует индекс, поэтому я начал проводить некоторые эксперименты. Случайно я заменил «NOT canceled» на «canceled=false», а затем Mysql начал использовать «canceled» в качестве индекса. После этого я попробовал использовать противоположное:
SELECT ... FROM reservations WHERE canceled ORDER BY ...
Тот же результат! Когда я изменяю это на "canceled=true", индекс снова работает.
Мой вопрос: КАК ЖЕ ТАК?! Разве использование «НЕ» не является «элегантным» способом? Во всяком случае, я не ожидал, что это будет иметь какое-либо значение.
Я использую InnoDB в качестве движка, но я получаю тот же результат с помощью MyISAM. Может ли кто-нибудь прояснить ситуацию? Спасибо.
Редактировать: Структура таблицы
CREATE TABLE `reservations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`trip_code` varchar(10) DEFAULT NULL,
`departure_date` date DEFAULT NULL,
`amount` float DEFAULT NULL,
`name` varchar(45) DEFAULT NULL,
`canceled` tinyint(1) NOT NULL DEFAULT '0',
`created_date` date NOT NULL,
`creator_user` int(11) NOT NULL DEFAULT '1',
`last_update_user` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `trip_code` (`trip_code`),
KEY `departure_date` (`departure_date`),
KEY `created_date` (`created_date`),
KEY `canceled` (`canceled`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=123181 ;