Po pierwsze, wystąpił problem z Twoim zapytaniem. Używasz LEFT JOIN, ale zamieniasz się w niejawne INNER JOIN z klauzulą where:AND (a.list_in='store' OR u.shop_active='1')
Dlaczego to zmienia LEFT JOIN w niejawną INNER? Ponieważ LEFT JOIN wygeneruje wartości NULL dla u.shop_active, gdy nie ma pasującego użytkownika, ale NULL NULL NIGDY nie będzie równy „1”. Spowoduje to przekształcenie zapytania w INNER JOIN, ponieważ wszystkie wiersze utworzone przez OUTER JOIN zostaną przefiltrowane według warunku WHERE.
Ten filtr jest również przyczyną problemu z wydajnością. Masz warunek OR między kolumnami w dwóch różnych tabelach. Nie ma indeksu, który mógłby spełnić taki warunek.
Oto inny sposób, który może działać lepiej. Ta wersja będzie wyszukiwać tylko aukcje, w których (a.list_in !='store' i u.shop_active ='1') jest mniej niż 12 aukcji list_in='store'.
Aby skorzystać z poniższych, upewnij się, że masz indeks na (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;