Devi avere un indice composito su (public, date)
In questo modo, MySQL filtrerà su public e ordina per date .
Dal tuo EXPLAIN Vedo che non hai un indice composito su (public, date) .
Invece hai due diversi indici su public e il date . Almeno, questo è il loro nome IDX_PUBLIC e DATE dillo.
Aggiornamento:
Tu public la colonna non è un BIT , è un BINARY(1) . È un tipo di carattere e utilizza il confronto dei caratteri.
Quando si confrontano interi con caratteri, MySQL converte il secondo nel primo, non viceversa.
Queste query restituiscono risultati diversi:
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
O cambia il tuo public colonna deve essere un bit oppure riscrivi la tua richiesta come segue:
SELECT c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC
, io. e. confronta i caratteri con i caratteri, non con i numeri interi.