Sie benötigen einen zusammengesetzten Index für (public, date)
Auf diese Weise MySQL
filtert nach public
und nach date
sortieren .
Aus Ihrem EXPLAIN
Wie ich sehe, haben Sie keinen zusammengesetzten Index für (public, date)
.
Stattdessen haben Sie zwei verschiedene Indizes auf public
und am date
. So lauten zumindest ihre Namen IDX_PUBLIC
und DATE
sagen.
Aktualisierung:
Sie public
Spalte ist kein BIT
, es ist ein BINARY(1)
. Es ist ein Zeichentyp und verwendet Zeichenvergleiche.
Beim Vergleich von Ganzzahlen mit Zeichen, MySQL
wandelt letzteres in ersteres um, nicht umgekehrt.
Diese Abfragen geben unterschiedliche Ergebnisse zurück:
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
Ändern Sie entweder Ihren public
Spalte ein bit
sein oder schreiben Sie Ihre Abfrage wie folgt um:
SELECT c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC
, ich. e. Vergleichen Sie Zeichen mit Zeichen, nicht mit ganzen Zahlen.