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.