For det første er der et problem med din forespørgsel. Du bruger LEFT JOIN, men du bliver til en implicit INNER JOIN med din where-klausul:AND (a.list_in='store' OR u.shop_active='1')
Hvorfor gør dette LEFT JOIN til et implicit INDRE? Fordi LEFT JOIN vil producere NULL-værdier for u.shop_active, når der ikke er nogen matchende bruger, men NULL vil ALDRIG være lig med '1'. Dette gør forespørgslen til en INNER JOIN, fordi alle rækker, der produceres af OUTER JOIN, vil blive filtreret efter WHERE-betingelsen.
Dette filter er også årsagen til ydeevneproblemet. Du har en ELLER-betingelse mellem kolonner i to forskellige tabeller. Der er intet indeks, der kan opfylde en sådan betingelse.
Her er en anden måde, som kan fungere bedre. Denne version søger kun efter fortegnelser, hvor (a.list_in !='store' og u.shop_active ='1'), når der er mindre end 12 list_in='store'-fortegnelser.
For at bruge følgende skal du sørge for, at du har et indeks på (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;