आपके पास (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
, मैं। इ। वर्णों की तुलना वर्णों से करें, पूर्णांकों से नहीं।