В последние дни я заметил что-то странное, оптимизирующее мой запрос. У меня есть простой запрос, который делает что-то вроде:
SELECT id,name,amount FROM reservations WHERE NOT canceled ORDER BY name ASC
Я заметил, что mysql не использовал какой-либо индекс, поэтому я начал делать некоторые эксперименты. Случайно я заменил "NOT cancel" на "cancel = false", а затем Mysql начал использовать "отмененный" как индекс. После этого я попытался использовать противоположное:
SELECT ... FROM reservations WHERE canceled ORDER BY ...
Тот же результат! Когда я меняю это на "cancel = 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 ;