アクセサリーと注文の2つのテーブルがあります。
[accessories.category]には、赤、緑、青などのカテゴリのリストが含まれています。注文テーブルには、過去の注文のリストが含まれています。
選択したい:
10 records from [accessories.category] WHERE category = 'Red' AND
10 records from [accessories.category] WHERE category = 'Green' AND
10 records from [accessories.category] WHERE category = 'Blue'
また、[accessories.catno]と等しい[orders.catno]に結合する注文テーブルを参照し、[accessories.stocklevel]> 0の商品のみを表示し、レコードセットをCOUNT(orders.sold)DESC(ベストセラーアイテムを表示)で注文します。最初)。
各カテゴリから一定数のレコードが必要だったので、UNION ALLクエリが適切であると判断しましたが、実際に機能します。問題は、開発ボックスで実行するのに0.3秒かかるため、本番環境に移行するのに十分な速度がないことです。「ORDERBYsoldDESC」を削除すると、クエリにかかる時間はわずか0.0236秒で、許容範囲内です。問題は、ORDERBYを失うことができないということです。
ところで:私は必要なすべてのフィールドにインデックスを付けました。クエリは次のとおりです。
(SELECT
accessories.catno,
accessories.category,
accessories.header,
accessories.description,
accessories.specialoffer,
accessories.picture,
accessories.unit,
accessories.addinfo,
accessories.post,
accessories.price,
accessories.vat,
accessories.soundclip,
COUNT(orders.catno) AS sold
FROM
accessories, orders
WHERE
orders.catno = accessories.catno
AND
accessories.category = 'Red'
AND accessories.stocklevel > 0 AND
accessories.category = 'Red'
GROUP BY catno
ORDER BY sold DESC
LIMIT 10)
UNION ALL
(SELECT
accessories.catno,
accessories.category,
accessories.header,
accessories.description,
accessories.specialoffer,
accessories.picture,
accessories.unit,
accessories.addinfo,
accessories.post,
accessories.price,
accessories.vat,
accessories.soundclip,
COUNT(orders.catno) AS sold
FROM
accessories, orders
WHERE
orders.catno = accessories.catno
AND
accessories.category = 'Green'
AND accessories.stocklevel > 0 AND
accessories.category = 'Green'
GROUP BY catno
ORDER BY sold DESC
LIMIT 10)
UNION ALL
(SELECT
accessories.catno,
accessories.category,
accessories.header,
accessories.description,
accessories.specialoffer,
accessories.picture,
accessories.unit,
accessories.addinfo,
accessories.post,
accessories.price,
accessories.vat,
accessories.soundclip,
COUNT(orders.catno) AS sold
FROM
accessories, orders
WHERE
orders.catno = accessories.catno
AND
accessories.category = 'Blue'
AND accessories.stocklevel > 0 AND
accessories.category = 'Blue'
GROUP BY catno
ORDER BY sold DESC
LIMIT 10)
このクエリで質問しすぎているのか、それとも再考する必要があるのかわからない。何か案は?
EXPLAINからの出力を追加しました。