【发布时间】:2013-01-25 18:01:36
【问题描述】:
我有两张表:附件和订单。
[accessories.category] 包含类别列表,即 Red、Green、Blue ... orders 表包含过去订单的列表。
我要选择:
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 秒。 如果我删除“ORDER BY sold DESC”,查询只需 0.0236 秒,这是可以接受的。问题是我不能丢失 ORDER BY。
顺便说一句:我已经索引了我需要的所有字段。这是查询:
(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 的输出。
【问题讨论】:
-
你确定你在
sold上有索引吗? -
我猜问题出在
COUNT。如果您可以对其进行非规范化并使用触发器对其进行更新,它应该会运行得更快。 -
在您的查询中显示 EXPLAIN 的输出?
-
@MikeBrant: sold 是一个计数,而不是一列,所以没有索引
-
那是你的问题,你正在对没有索引的东西进行排序。
标签: mysql performance