Vous devez avoir un index composite sur (public, date)
De cette façon, MySQL
filtrera sur public
et trier sur date
.
À partir de votre EXPLAIN
Je vois que vous n'avez pas d'index composite sur (public, date)
.
Au lieu de cela, vous avez deux index différents sur public
et le date
. Du moins, c'est ce que leurs noms IDX_PUBLIC
et DATE
dire.
Mise à jour :
Vous public
la colonne n'est pas un BIT
, c'est un BINARY(1)
. C'est un type de caractère et utilise la comparaison de caractères.
Lors de la comparaison d'entiers à des caractères, MySQL
convertit ce dernier en premier, et non l'inverse.
Ces requêtes renvoient des résultats différents :
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
Soit changer votre public
la colonne doit être un bit
ou réécrivez votre requête comme suit :
SELECT c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC
, je. e. comparer des caractères avec des caractères, pas des entiers.