Você precisa ter um índice composto em
(public, date)
Desta forma,
MySQL
filtrará em public
e classifique em date
. Do seu
EXPLAIN
Vejo que você não tem um índice composto em (public, date)
. Em vez disso, você tem dois índices diferentes em
public
e em date
. Pelo menos, é o que seus nomes IDX_PUBLIC
e DATE
dizer. Atualização:
Você
public
coluna não é um BIT
, é um BINARY(1)
. É um tipo de caractere e usa comparação de caracteres. Ao comparar inteiros com caracteres,
MySQL
converte o último no primeiro, e não vice-versa. Essas consultas retornam resultados diferentes:
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
Altere seu
public
coluna para ser um bit
ou reescreva sua consulta assim:SELECT c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC
, eu. e. compare caracteres com caracteres, não inteiros.