Trong những ngày qua tôi nhận thấy có điều gì đó kỳ lạ tối ưu hóa truy vấn của mình. Tôi có một câu hỏi đơn giản mà làm điều gì đó như:MYSQL - NOT vs var = false
SELECT id,name,amount FROM reservations WHERE NOT canceled ORDER BY name ASC
tôi nhận thấy mysql đã không sử dụng bất kỳ chỉ số, vì vậy tôi bắt đầu làm một số thí nghiệm. Vô tình tôi thay thế "NOT cancel" bằng "cancel = false", và sau đó, Mysql bắt đầu sử dụng "cancel" làm chỉ mục. Sau đó tôi đã thử sử dụng đối diện:
SELECT ... FROM reservations WHERE canceled ORDER BY ...
Kết quả tương tự! Khi tôi thay đổi điều đó thành "cancel = true", chỉ mục sẽ hoạt động trở lại.
Câu hỏi của tôi là: HOW COME ?! Không sử dụng "KHÔNG" cách "thanh lịch"? Dù sao thì tôi cũng không mong đợi nó tạo nên sự khác biệt nào.
Tôi đang sử dụng InnoDB làm công cụ, nhưng tôi nhận được kết quả tương tự bằng cách sử dụng MyISAM. Ai đó có thể làm rõ mọi thứ không? Cảm ơn.
Edit: Bảng cấu trúc
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 ;
bạn sử dụng phiên bản nào? – neworld
Phiên bản máy chủ: 5.1.43-cộng đồng – Phoenix
Bạn có thể đăng lên DDL của bảng hay không. –