このクエリを最適化したい。テーブルを使用するための統計を提供しました。
productsおよびproducts_categoriesテーブルには、約5ラックのレコードがあります。しかし、以下のカテゴリーでは、1600のレコードがあります。この1600レコード用のスロットを作成しました。すべての製品には、最小1スロットと最大10スロットを設定できます。しかし、スロットテーブルには約3ラックの記録があります。スロットテーブルには、すでに期限切れのスロットがある場合もあります。間もなく期限切れになる商品が先に来て、残りの商品がこの商品の後ろに来るようにしたいと思います。
end_time列のインデックスを作成しました。ただし、条件演算子を使用したため、このクエリではインデックスを使用していません。このクエリを最適化したい。親切に最善の方法を教えてください。
EXPLAIN
SELECT products.*, IF(slot.end_time > NOW(), 1, 2) as order_by_end_time
FROM products
INNER JOIN products_categories ON products_categories.productid = products.productid
LEFT JOIN (select product_id, end_time from slot where end_time>now() order by end_time) as slot ON slot.product_id = products.productid
WHERE products_categories.categoryid='4410'
AND products.saleid = 2
GROUP BY products.productid
ORDER BY order_by_end_time ASC , slot.end_time ASC