组合快速MySQL查询的性能较慢
我有两个查询,当分别运行时运行得非常快,但是当将其中一个作为子查询组合使用时,性能会急剧下降 快速查询一: 快速查询二: 组合查询非常慢: 解释组合查询结果: 我已经花了几个小时试图弄明白为什么以这种方式组合它们时会变得如此缓慢,并试图重写组合查询,但没有结果,因此我向这里的专家寻求帮助组合快速MySQL查询的性能较慢,mysql,performance,Mysql,Performance,我有两个查询,当分别运行时运行得非常快,但是当将其中一个作为子查询组合使用时,性能会急剧下降 快速查询一: 快速查询二: 组合查询非常慢: 解释组合查询结果: 我已经花了几个小时试图弄明白为什么以这种方式组合它们时会变得如此缓慢,并试图重写组合查询,但没有结果,因此我向这里的专家寻求帮助 是什么原因导致它变得如此缓慢?我应该做些什么来加快它?您正在对7个表进行连接,这肯定非常缓慢。我建议不要加入超过3个表 您是否尝试过单独执行这两个查询,然后合并它们的结果?您正在对7个表进行联接,这肯定非常慢
是什么原因导致它变得如此缓慢?我应该做些什么来加快它?您正在对7个表进行连接,这肯定非常缓慢。我建议不要加入超过3个表
您是否尝试过单独执行这两个查询,然后合并它们的结果?您正在对7个表进行联接,这肯定非常慢。我建议不要加入超过3个表
您是否尝试过单独执行这两个查询,然后合并它们的结果?QueryII感觉它有一百万行;生成的tmp表没有索引;它隐藏在一个左连接后面。尽管如此,优化器似乎足够聪明,可以从这个混乱开始,为联合查询提供7904行 你能避开左边吗 然后代码继续进行,但最终必须对照表扫描中的18057行检查所有这些行。同样,优化器通过使用连接缓冲区做了一件聪明的事情。尽管如此,7904*923*18057还是有很多行需要查看 这似乎是邪恶的部分:
LEFT JOIN
( SELECT `products_id`,
`products_stock_attributes`,
`products_stock_quantity`
FROM products_stock
WHERE `products_stock_quantity` > 0
) t
ON t.products_id = p.products_id
WHERE t.products_stock_attributes IN ( '1-31', '1-25', '1-18', '1-7' )
所有这些似乎都是危险信号:
不必要的离开;
属性在哪里。。。在子查询外部,当它们可以在内部时;
您可能会将CountDISTINCT t.products\u stock\u attributes=4折叠到子查询中。
查询II感觉它有一百万行;生成的tmp表没有索引;它隐藏在一个左连接后面。尽管如此,优化器似乎足够聪明,可以从这个混乱开始,为联合查询提供7904行 你能避开左边吗 然后代码继续进行,但最终必须对照表扫描中的18057行检查所有这些行。同样,优化器通过使用连接缓冲区做了一件聪明的事情。尽管如此,7904*923*18057还是有很多行需要查看 这似乎是邪恶的部分:
LEFT JOIN
( SELECT `products_id`,
`products_stock_attributes`,
`products_stock_quantity`
FROM products_stock
WHERE `products_stock_quantity` > 0
) t
ON t.products_id = p.products_id
WHERE t.products_stock_attributes IN ( '1-31', '1-25', '1-18', '1-7' )
所有这些似乎都是危险信号:
不必要的离开;
属性在哪里。。。在子查询外部,当它们可以在内部时;
您可能会将CountDISTINCT t.products\u stock\u attributes=4折叠到子查询中。
谢谢你试图帮助我。谢谢谢谢你试图帮助我。谢谢是的,将WHERE t.products\u stock\u属性和CountDISTINCT t t.products\u stock\u attributes=4移动到此子查询中解决了问题。非常感谢!!:是的,将WHERE t.products\u stock\u属性和CountDISTINCT t t.products\u stock\u attributes=4移动到此子查询中解决了问题。非常感谢!!:
SELECT DISTINCT p.products_image,
p.products_subimage1,
pd.products_name,
p.products_quantity,
p.products_model,
p.products_ordered,
p.products_id,
p.products_price,
sul.date_time,
p.products_weight,
p.products_length,
p.products_width,
p.products_height,
p.products_tax_class_id,
p.products_status,
IF(s.status, s.specials_new_products_price, NULL) AS
specials_new_products_price,
IF(s.status, s.specials_new_products_price, p.products_price) AS
final_price
FROM products p
LEFT JOIN specials s
ON p.products_id = s.products_id
LEFT JOIN products_to_categories p2c
ON p.products_id = p2c.products_id
LEFT JOIN products_description pd
ON p.products_id = pd.products_id
LEFT JOIN (SELECT sul2.*
FROM stock_update_log sul2
INNER JOIN (SELECT products_id,
Max(date_time) AS maxDateTime
FROM stock_update_log
WHERE stock_qty_change > 1
AND id > 154700
AND Date_sub(Curdate(),
INTERVAL 360 day)
<=
From_unixtime(date_time)
GROUP BY products_id)gsul
ON sul2.products_id = gsul.products_id
AND sul2.date_time = gsul.maxdatetime) sul
ON p.products_id = sul.products_id
LEFT JOIN products_attributes pa
ON p.products_id = pa.products_id
LEFT JOIN (SELECT `products_id`,
`products_stock_attributes`,
`products_stock_quantity`
FROM products_stock
WHERE `products_stock_quantity` > 0) t
ON t.products_id = p.products_id
WHERE t.products_stock_attributes IN ( '1-31', '1-25', '1-18', '1-7' )
AND p.products_status = '1'
AND Date_sub(Curdate(), INTERVAL 360 day) <= From_unixtime(sul.date_time)
AND Date_sub(Curdate(), INTERVAL 30 day) >= p.products_date_added
AND sul.id > 154700
AND sul.stock_qty_change > 1
AND pa.options_values_id IN ( 31, 25, 18, 7 )
GROUP BY p.products_id
HAVING Count(DISTINCT pa.options_values_id) = 4
AND Count(DISTINCT t.products_stock_attributes) = 4
ORDER BY sul.date_time DESC
LEFT JOIN
( SELECT `products_id`,
`products_stock_attributes`,
`products_stock_quantity`
FROM products_stock
WHERE `products_stock_quantity` > 0
) t
ON t.products_id = p.products_id
WHERE t.products_stock_attributes IN ( '1-31', '1-25', '1-18', '1-7' )