Pertama, ada masalah dengan kueri Anda. Anda menggunakan LEFT JOIN, tetapi Anda berubah menjadi INNER JOIN implisit dengan klausa where Anda:AND (a.list_in='store' OR u.shop_active='1')
Mengapa ini mengubah LEFT JOIN menjadi INNER implisit? Karena LEFT JOIN akan menghasilkan nilai NULL untuk u.shop_active ketika tidak ada pengguna yang cocok, tetapi NULL TIDAK PERNAH sama dengan '1'. Ini mengubah kueri menjadi INNER JOIN karena setiap baris yang dihasilkan oleh OUTER JOIN akan difilter oleh kondisi WHERE.
Filter ini juga menjadi penyebab masalah kinerja. Anda memiliki kondisi ATAU antara kolom dalam dua tabel yang berbeda. Tidak ada indeks yang dapat memenuhi kondisi seperti itu.
Berikut adalah cara lain yang mungkin berkinerja lebih baik. Versi ini hanya akan mencari cantuman di mana (a.list_in !='store' dan u.shop_active ='1') bila ada kurang dari 12 list_in='store' cantuman.
Untuk menggunakan yang berikut, pastikan Anda memiliki indeks di (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;