MySql从子查询选择速度慢(即使子查询本身速度快)
我正在尝试加快此查询的速度:MySql从子查询选择速度慢(即使子查询本身速度快),mysql,select,subquery,Mysql,Select,Subquery,我正在尝试加快此查询的速度: SELECT order.id FROM ( SELECT o.id FROM `order` as `o` INNER JOIN order_item as oi on oi.order_id = o.id AND `o`.`canceled` = 0 AND ( `o`.`return_date` > "2011-03-14" OR oi.checked = 0 OR
SELECT order.id
FROM (
SELECT o.id
FROM `order` as `o`
INNER JOIN order_item as oi on
oi.order_id = o.id
AND `o`.`canceled` = 0
AND ( `o`.`return_date` > "2011-03-14" OR oi.checked = 0 OR '2011-03-14' < oi.last_update)
) as `order`
它的时钟为0.0930秒。子查询将从订单中选择*作为。。。在它自己的时钟上,0.0005秒。我正在测试的表大约有10000行,43行是从where子句子查询返回的
除了加快查询速度之外,如果有人能向我解释为什么当我将查询打包到另一个查询中时,查询速度会慢100倍以上,我真的很想这样做
MySql explain告诉我,它自己的子查询首先选择o,然后选择oi。整个查询的MySql explain首先选择derived2?,然后依次选择o和oi
我希望子查询是一个子查询,因为我正在做很多连接,这些连接不在where子句中,我已经从代码和基准中排除了它们。如果我单独使用子查询和连接,查询速度会更慢
任何帮助都将不胜感激。我一直在寻找答案,但找不到,这可能只是因为我不知道该找什么,如果是,我道歉
检查索引
您是否优化了正在使用的表?
如果将SELECT语句中的*更改为所需列的实际名称,查询将运行得更快。
您是否需要多个按订单id分组-一个在另一个内部?
MySQL会在对内联视图执行任何操作之前对其进行缓冲
对于第一个查询,您看到的0.0006秒很可能是获取第一行的响应时间,而不是获取最后一行的总时间
如果id是订单表上的主键,则不需要在其上设置GROUP BY
如果您的每个订单有很多项目,平均每个订单超过20个项目左右,您可以尝试创建以下索引:
order_item (order_id, checked)
order_item (order_id, last_update)
并将相关子查询一分为二:
SELECT *
FROM order o
WHERE o.canceled = 0
AND
(
o.return_date > '2011-03-14'
OR
(
SELECT MIN(checked)
FROM order_item oi
WHERE order_id = o.id
) = 0
OR
(
SELECT MAX(last_update)
FROM order_item oi
WHERE oi.order_id = o.id
) > '2011-03-14'
)
同样,这只有在每个项目都有大量订单的情况下才有帮助,否则,对所有订单进行一次扫描将更有效率。1。我应该找什么?我已经调查过了,但没有任何改进。2.MySql说它不能选择这些表,它确实重新创建了它们。不幸的是,这没有帮助。3.我“手动”选择字段,我只是在处理这个问题时简化了查询。1。订单需要在id上有索引,在订单id1上有订单项目。我正在使用MySql工作台。Order.id有两个索引,类型为PRIMARY和UNIQUE,Order\u item.Order\u id有一个索引类型index。请尝试删除其中的1,这可能会稍微缩短时间。请参阅4。尝试删除第一组和第二组,只留下最后一组。我已经更改了查询,因为您可以看到,这种新方法更快,但您的答案确实很有帮助。我一直在胡思乱想,因为我认为包装子查询会使它变得非常慢,尽管正如您所说,子查询本身似乎更快,因为响应时间仅限于第一行。谢谢你帮我理解这一点!我认为我需要保留“groupby”,因为我正在进行连接和group_concats,我已将其从示例和基准中排除。