Bạn cần có một chỉ mục tổng hợp trên (public, date)
Bằng cách này, MySQL
sẽ lọc trên public
và sắp xếp vào ngày date
.
Từ EXPLAIN
của bạn Tôi thấy rằng bạn không có chỉ mục tổng hợp trên (public, date)
.
Thay vào đó, bạn có hai chỉ mục khác nhau trên public
và vào ngày date
. Ít nhất, đó là tên của họ IDX_PUBLIC
và DATE
kể.
Cập nhật:
Bạn public
cột không phải là BIT
, đó là BINARY(1)
. Đó là một kiểu ký tự và sử dụng phép so sánh ký tự.
Khi so sánh số nguyên với ký tự, MySQL
chuyển đổi cái sau thành cái trước, không phải ngược lại.
Các truy vấn này trả về các kết quả khác nhau:
CREATE TABLE t_binary (val BINARY(2) NOT NULL);
INSERT
INTO t_binary
VALUES
(1),
(2),
(3),
(10);
SELECT *
FROM t_binary
WHERE val <= 10;
---
1
2
3
10
SELECT *
FROM t_binary
WHERE val <= '10';
---
1
10
Thay đổi public
của bạn là một bit
hoặc viết lại truy vấn của bạn như sau:
SELECT c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC
, tôi. e. so sánh các ký tự với các ký tự, không phải số nguyên.