सबसे पहले, आपकी क्वेरी में कोई समस्या है। आप लेफ्ट जॉइन का उपयोग करते हैं, लेकिन आप अपने जहां क्लॉज के साथ एक अंतर्निहित इनर जॉइन में बदल जाते हैं:और (a.list_in='store' OR u.shop_active='1')
यह बाएं जॉइन को एक अंतर्निहित आंतरिक में क्यों बदल देता है? चूंकि कोई मेल खाने वाला उपयोगकर्ता नहीं होने पर LEFT JOIN u.shop_active के लिए NULL मान उत्पन्न करेगा, लेकिन NULL कभी भी '1' के बराबर नहीं होगा। यह क्वेरी को एक INNER JOIN में बदल देता है क्योंकि OUTER JOIN द्वारा निर्मित किसी भी पंक्ति को WHERE कंडीशन द्वारा फ़िल्टर किया जाएगा।
यह फ़िल्टर भी प्रदर्शन समस्या का कारण है। आपके पास दो अलग-अलग तालिकाओं में स्तंभों के बीच एक OR शर्त है। ऐसी कोई भी अनुक्रमणिका नहीं है जो ऐसी शर्त को पूरा कर सके।
यहां एक और तरीका है जो बेहतर प्रदर्शन कर सकता है। यह संस्करण केवल उन लिस्टिंग की खोज करेगा जहां (a.list_in !='store' and u.shop_active ='1') जब 12 से कम list_in='store' लिस्टिंग हैं।
निम्न का उपयोग करने के लिए, सुनिश्चित करें कि आपके पास एक अनुक्रमणिका है (list_in, end_time)
SELECT * FROM
(
SELECT a.listing_id, a.name, a.item_price, a.max, a.nb, a.currency,
a.end_time, a.closed, a.bold, a.hl, a.buy_price, a.is_offer, a.reserve,
a.owner_id, a.postage_amount, a.fb_current_bid, a.type, a.start_time,
a.is_relisted_item, a.enable
FROM db_listings a
WHERE list_in = 'store'
a.active=1 AND
a.approved=1 AND
a.deleted=0 AND
a.creation_in_progress=0 AND
a.closed=0
ORDER BY end_time
LIMIT 12
)
UNION ALL
(
SELECT a.listing_id, a.name, a.item_price, a.max, a.nb, a.currency,
a.end_time, a.closed, a.bold, a.hl, a.buy_price, a.is_offer, a.reserve,
a.owner_id, a.postage_amount, a.fb_current_bid, a.type, a.start_time,
a.is_relisted_item, a.enable
FROM db_listings a
JOIN users u
ON a.owner_id = u.user_id
AND u.shop_active = '1'
WHERE list_in != 'store' AND
a.active=1 AND
a.approved=1 AND
a.deleted=0 AND
a.creation_in_progress=0 AND
a.closed=0
ORDER BY end_time
LIMIT 12
)
) sq
ORDER BY list_in, end_time
LIMIT 12;