Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation de filesort pour trier par colonne datetime dans MySQL

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.