W ostatnich dniach zauważyłem coś dziwnego optymalizującego moje zapytanie. Mam proste kwerendy, która robi coś takiego:MYSQL - NOT vs var = false
SELECT id,name,amount FROM reservations WHERE NOT canceled ORDER BY name ASC
zauważyłem mysql nie używał żadnego indeksu, więc zacząłem robić jakieś eksperymenty. Przypadkowo zastąpiłem "NOT cancelled" przez "canceled = false", a następnie Mysql zaczął używać "canceled" jako indeksu. Potem próbowałem za pomocą przeciwnego:
SELECT ... FROM reservations WHERE canceled ORDER BY ...
sam wynik! Kiedy zmienię to na "canceled = true", indeks działa ponownie.
Moje pytanie brzmi: JAK PRZYJDŹ ?! Nie używa "NIE" w "elegancki" sposób? W każdym razie nie spodziewałem się, że to zrobi jakąkolwiek różnicę.
Używam InnoDB jako silnika, ale otrzymuję ten sam wynik za pomocą MyISAM. Czy ktoś może to wyjaśnić? Dzięki.
Edycja: Struktura Tabela
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 ;
której wersji używasz? – neworld
Wersja serwera: 5.1.43-społeczność – Phoenix
Czy możesz opublikować DDL tabeli. –