Du skal have et sammensat indeks på (public, date)
På denne måde MySQL
vil filtrere på public
og sorter på date
.
Fra din EXPLAIN
Jeg kan se, at du ikke har et sammensat indeks på (public, date)
.
I stedet har du to forskellige indekser på public
og på date
. Det er i hvert fald hvad deres navne IDX_PUBLIC
og DATE
fortæl.
Opdatering:
Du public
kolonne er ikke en BIT
, det er en BINARY(1)
. Det er en tegntype og bruger tegnsammenligning.
Når man sammenligner heltal med tegn, MySQL
konverterer sidstnævnte til førstnævnte, ikke omvendt.
Disse forespørgsler returnerer forskellige resultater:
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
Skift enten din public
kolonne til at være en bit
eller omskriv din forespørgsel som dette:
SELECT c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC
, dvs. e. sammenligne tegn med tegn, ikke heltal.