Trước hết, có một vấn đề với truy vấn của bạn. Bạn sử dụng LEFT JOIN, nhưng bạn biến thành INNER JOIN ngầm với mệnh đề where:AND (a.list_in ='store' OR u.shop_active ='1')
Tại sao điều này lại biến LEFT JOIN thành một INNER ngầm? Bởi vì LEFT JOIN sẽ tạo ra các giá trị NULL cho u.shop_active khi không có người dùng phù hợp, nhưng NULL sẽ KHÔNG BAO GIỜ bằng '1'. Điều này biến truy vấn thành một INNER JOIN vì bất kỳ hàng nào được tạo bởi OUTER JOIN sẽ được lọc theo điều kiện WHERE.
Bộ lọc này cũng là lý do cho sự cố hiệu suất. Bạn có một điều kiện HOẶC giữa các cột trong hai bảng khác nhau. Không có chỉ mục nào có thể thỏa mãn điều kiện như vậy.
Đây là một cách khác có thể hoạt động tốt hơn. Phiên bản này sẽ chỉ tìm kiếm các danh sách trong đó (a.list_in! ='Store' và u.shop_active ='1') khi có ít hơn 12 danh sách list_in ='store'.
Để sử dụng những thứ sau, hãy đảm bảo bạn có chỉ mục trên (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;