まず、クエリに問題があります。 LEFT JOINを使用しますが、where句を使用して暗黙のINNER JOINに変換します:AND(a.list_in ='store' OR u.shop_active ='1')
なぜこれがLEFTJOINを暗黙のINNERに変えるのですか?一致するユーザーがない場合、LEFT JOINはu.shop_activeに対してNULL値を生成しますが、NULLが「1」と等しくなることはありません。これにより、クエリがINNER JOINに変わります。これは、OUTERJOINによって生成されたすべての行がWHERE条件によってフィルタリングされるためです。
このフィルターは、パフォーマンスの問題の原因でもあります。 2つの異なるテーブルの列間にOR条件があります。このような条件を満たすインデックスはありません。
これは、パフォーマンスを向上させる可能性のある別の方法です。このバージョンでは、list_in ='store'のリストが12未満の場合にのみ、(a.list_in!='store'およびu.shop_active='1')のリストが検索されます。
以下を使用するには、(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;