Anda harus memiliki indeks komposit pada (public, date)
Dengan cara ini, MySQL
akan memfilter di public
dan urutkan pada date
.
Dari EXPLAIN
Saya melihat bahwa Anda tidak memiliki indeks komposit pada (public, date)
.
Alih-alih, Anda memiliki dua indeks berbeda di public
dan pada date
. Setidaknya begitulah nama mereka IDX_PUBLIC
dan DATE
beritahu.
Pembaruan:
Anda public
kolom bukan BIT
, ini adalah BINARY(1)
. Ini adalah tipe karakter dan menggunakan perbandingan karakter.
Saat membandingkan bilangan bulat dengan karakter, MySQL
mengubah yang terakhir menjadi yang pertama, bukan sebaliknya.
Kueri ini mengembalikan hasil yang berbeda:
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
Ubah public
kolom menjadi bit
atau tulis ulang kueri Anda seperti ini:
SELECT c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC
, saya. e. membandingkan karakter dengan karakter, bukan bilangan bulat.