Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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
MySql从子查询选择速度慢(即使子查询本身速度快)_Mysql_Select_Subquery - Fatal编程技术网

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,我已将其从示例和基准中排除。