Трябва да имате съставен индекс на (public, date)
По този начин MySQL
ще филтрира на public
и сортирайте на date
.
От вашия EXPLAIN
Виждам, че нямате съставен индекс на (public, date)
.
Вместо това имате два различни индекса на public
и на date
. Поне така се казват IDX_PUBLIC
и DATE
кажи.
Актуализация:
Вие public
колоната не е BIT
, това е BINARY(1)
. Това е тип символ и използва сравнение на знаци.
Когато сравнявате цели числа със знаци, MySQL
преобразува последното в първото, а не обратното.
Тези заявки връщат различни резултати:
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
Или променете своя public
колоната да бъде bit
или пренапишете заявката си така:
SELECT c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC
, i. д. сравнявайте знаци със знаци, а не с цели числа.