Трябва да имате съставен индекс на (public, date)
По този начин MySQL ще филтрира на public и сортирайте на date .
От вашия EXPLAIN Виждам, че нямате съставен индекс на (public, date) .
Вместо това имате два различни индекса на public и на date . Поне така се казват IDX_PUBLIC и DATE кажи.
Актуализация:
Вие public колоната не е BIT , това е BINARY(1) . Това е тип символ и използва сравнение на знаци.
Когато сравнявате цели числа със знаци, MySQL преобразува последното в първото, а не обратното.
Тези заявки връщат различни резултати:
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
Или променете своя public колоната да бъде bit или пренапишете заявката си така:
SELECT c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC
, i. д. сравнявайте знаци със знаци, а не с цели числа.