Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ORDERBY子句时Mysql慢速联合查询_Mysql_Performance - Fatal编程技术网

使用ORDERBY子句时Mysql慢速联合查询

使用ORDERBY子句时Mysql慢速联合查询,mysql,performance,Mysql,Performance,我有两张桌子:配件和订单 [附件.类别]包含类别列表,即红色、绿色、蓝色。。。 订单表包含过去订单的列表 我想选择: 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 = '

我有两张桌子:配件和订单

[附件.类别]包含类别列表,即红色、绿色、蓝色。。。 订单表包含过去订单的列表

我想选择:

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表,其中它等于[orders.catno],仅显示[accessories.stocklevel]>0的产品,并按COUNTorders.Selled DESC订购记录集,首先显示畅销商品

因为我想从每个类别中获得一定数量的记录,所以我决定使用UNIONALL查询是合适的,而且确实有效。 问题是它的速度不够快,无法投入生产,因为在我的开发箱上执行需要0.3秒。 如果按销售描述删除订单,查询只需0.0236秒,这是可以接受的。问题是我不能错过订单

顺便说一句:我已经索引了所有我需要的字段。以下是查询:

(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的输出


尝试此查询,尽管它未经测试,但请尝试

SET @level = 0;
SET @group = '';

SELECT 
    *
FROM (
    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,
          @level := IF(@group = accessories.category, @level+1, 1) AS level, 
          @group := accessories.category as E_Group 
    FROM accessories,
      orders
      left join orders
        on orders.catno = accessories.catno
    WHERE accessories.stocklevel > 0
    GROUP BY orders.catno, accessories.category
    ORDER BY orders.sold DESC
) rs
WHERE level < 11 

尝试一下这个查询

 (  SELECT * FROM ( 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 * FROM (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 * FROM ( 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)

正如Alex所建议的,您可以制作一个专栏,并使用触发器使其保持最新。或者您可以每小时定期运行查询?每5分钟?每1分钟?然后将结果保存在另一个表中,或者更好的做法是,缓存我猜您从中生成的html,并完全避免查询。

您确定您有一个已售出的索引吗?我猜问题在于计数。如果您可以对其进行反规范化并使用触发器进行更新,它应该会运行得更快。在查询中显示EXPLAIN的输出?@MikeBrant:Seld是一个计数,而不是一列,因此没有索引。好吧,这是您的问题,您正在对未索引的内容进行排序。1064-您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在第1行“UNION ALL SELECT accessories.catno,accessories.category,accessories.header,a”附近使用的正确语法恐怕不太幸运。不确定该嵌套选择?我不认为问题与没有销售索引有关,因为我将销售更改为COUNTorders.price作为销售订单。price是一个索引字段,对查询执行速度没有影响。@Alex:-谢谢您的输入:。我创建了字段[orders.sell],用一个实随机整数填充它,并将其设置为索引。我在ORDERBYSELD子句中离开,查询执行速度提高到0.6秒。我不知道这是为什么?对这个问题的解释可能会告诉你。你可能想在分类上建立一个综合索引,索尔德这是行不通的。。即使我能够优化查询,解决方案也不会是可伸缩的。最后,我创建了一个新的表格,列出了每个类别的前20名畅销书。运行此查询时,执行时间仅为:0.0019秒。完美的