Ces derniers jours, j'ai remarqué quelque chose de bizarre optimisant ma requête. J'ai une requête simple qui fait quelque chose comme:MYSQL - NOT vs var = false
SELECT id,name,amount FROM reservations WHERE NOT canceled ORDER BY name ASC
j'ai remarqué MySQL n'utilisait un indice, donc je commencé à faire quelques expériences. Accidentellement, j'ai remplacé le "NON annulé" par "cancelé = faux", puis, Mysql a commencé à utiliser "cancelé" comme index. Après que j'essayé d'utiliser le contraire:
SELECT ... FROM reservations WHERE canceled ORDER BY ...
Même résultat! Quand je change cela en "cancelled = true", l'index fonctionne à nouveau.
Ma question est: COMMENT VENIR ?! N'utilise pas "NON" la manière "élégante"? De toute façon, je ne m'attendais pas à ce que cela fasse une différence.
J'utilise InnoDB comme moteur, mais j'obtiens le même résultat en utilisant MyISAM. Quelqu'un peut-il clarifier les choses? Merci.
Edit: Structure de la table
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 ;
quelle version utilisez-vous? – neworld
Version du serveur: 5.1.43-community – Phoenix
Pouvez-vous poster le DDL de la table. –