Ten eerste is er een probleem met uw vraag. Je gebruikt LEFT JOIN, maar je verandert in een impliciete INNER JOIN met je waar-clausule:AND (a.list_in='store' OR u.shop_active='1')
Waarom verandert dit de LEFT JOIN in een impliciete INNER? Omdat de LEFT JOIN NULL-waarden produceert voor u.shop_active wanneer er geen overeenkomende gebruiker is, maar NULL NOOIT gelijk is aan '1'. Dit verandert de query in een INNER JOIN omdat alle rijen die door de OUTER JOIN worden geproduceerd, worden gefilterd op de WHERE-voorwaarde.
Dit filter is ook de reden voor het prestatieprobleem. U hebt een OF-voorwaarde tussen kolommen in twee verschillende tabellen. Er is geen index die aan een dergelijke voorwaarde kan voldoen.
Hier is een andere manier die mogelijk beter presteert. Deze versie zoekt alleen naar vermeldingen waar (a.list_in !='store' en u.shop_active ='1') als er minder dan 12 list_in='store'-vermeldingen zijn.
Om het volgende te gebruiken, zorg je ervoor dat je een index hebt op (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;