Musisz mieć złożony indeks w dniu (public, date)
W ten sposób MySQL
będzie filtrować według public
i sortuj według date
.
Z Twojego EXPLAIN
Widzę, że nie masz indeksu złożonego w dniu (public, date)
.
Zamiast tego masz dwa różne indeksy na public
i w date
. Przynajmniej takie są ich nazwy IDX_PUBLIC
i DATE
powiedz.
Aktualizacja:
Jesteś public
kolumna nie jest BIT
, jest to plik BINARY(1)
. Jest to typ postaci i używa porównania znaków.
Porównując liczby całkowite ze znakami, MySQL
przekształca to drugie w pierwsze, a nie odwrotnie.
Te zapytania zwracają różne wyniki:
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
Zmień swój public
kolumna ma być bit
lub przepisz zapytanie w ten sposób:
SELECT c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC
, i. mi. porównaj znaki ze znakami, a nie liczbami całkowitymi.