Първо, има проблем с вашата заявка. Използвате LEFT JOIN, но се превръщате в имплицитно INNER JOIN с вашата клауза where:AND (a.list_in='store' ИЛИ u.shop_active='1')
Защо това превръща LEFT JOIN в имплицитно INNER? Тъй като LEFT JOIN ще произведе NULL стойности за u.shop_active, когато няма съответстващ потребител, но NULL НИКОГА няма да е равно на '1'. Това превръща заявката във INNER JOIN, тъй като всички редове, произведени от OUTER JOIN, ще бъдат филтрирани от условието WHERE.
Този филтър е и причината за проблема с производителността. Имате условие ИЛИ между колоните в две различни таблици. Няма индекс, който да удовлетвори такова условие.
Ето още един начин, който може да работи по-добре. Тази версия ще търси само обяви, където (a.list_in !='store' и 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;