En los últimos días noté algo raro al optimizar mi consulta. Tengo una consulta simple que hace algo como:MYSQL - NO frente a var = falso
SELECT id,name,amount FROM reservations WHERE NOT canceled ORDER BY name ASC
Noté MySQL no se utiliza ningún índice, por lo que empecé a hacer algunos experimentos. Accidentalmente reemplacé el "NO cancelado" con "cancelado = falso", y luego, Mysql comenzó a usar "cancelado" como índice. Después de eso he intentado usar el contrario:
SELECT ... FROM reservations WHERE canceled ORDER BY ...
mismo resultado! Cuando cambio eso a "cancelado = verdadero" el índice funciona nuevamente.
Mi pregunta es: ¿CÓMO PUEDE SER ?! ¿No está usando "NO" la manera "elegante"? De todos modos, no esperaba que hiciera ninguna diferencia.
Estoy usando InnoDB como el motor, pero obtengo el mismo resultado usando MyISAM. ¿Alguien puede aclarar las cosas? Gracias.
Editar: Estructura de la tabla
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 ;
¿qué versión usas? – neworld
Versión del servidor: comunidad 5.1.43 – Phoenix
Puedes publicar el DDL de la tabla. –