select子查询导致mysql服务器无响应

时间:2013-11-06 03:45:15

标签: php mysql phpmyadmin

DELETE FROM item_measurement
WHERE measurement_id IN (
   SELECT (-id) AS measurement_id
   FROM invoice_item
   WHERE invoice_id = 'A3722'
)

我真的很努力地发现代码有什么问题。我试图在php页面中运行它,它没有响应。我也尝试在phpmyadmin,无限旋转圈中的同一行,我不得不重新启动服务器(Mac 10.9上的MAMP)。浏览器/

中没有给出错误

如果我运行删除并单独选择,它们都会很快完成。我不认为这是一个性能问题,因为单独的运行需要<每个0.1秒。

感谢您提前提供任何帮助。

编辑:

我还发现一个简单的select语句也会挂起mysql:

select *
    from item_measurement
    where measurement_id in 
    (select -id from invoice_item where invoice_id='A3722')

跟进:

查询将成功运行,只需要意外地长时间运行。结果如下:

item_measurement表中的〜200k行

Screenshot of the result

3 个答案:

答案 0 :(得分:0)

只是一个问题,但你在子查询中使用别名是什么?我不是专家。

DELETE (What?)
FROM item_measurement
WHERE measurement_id IN
(SELECT -id FROM invoice_item
WHERE invoice_id = 'A3722')

答案 1 :(得分:0)

下面的内联视图生成临时表(存储在MySQL内部区域中):

(
SELECT (-id) AS measurement_id
FROM invoice_item
WHERE invoice_id = 'A3722'
)

和measurement_id在上面的临时表中搜索。但临时表没有索引。所以它很慢。

像这样修改。这使用INDEX:

DELETE item_measurement
FROM item_measurement m, invoice_item i
WHERE m.measurement_id = (-i.id)
  AND i.invoice_id = 'A3722'

被修改

出于同样的原因,下面的查询也慢了

select *
from item_measurement
where measurement_id in 
(select -id from invoice_item where invoice_id='A3722')

这就是为什么MySQL manaul说使用连接而不是使用子查询。

答案 2 :(得分:-1)

DELETE FROM `item_measurement` WHERE `measurement_id` in ( SELECT `id` as measurement_id FROM `invoice_item` WHERE `invoice_id` = 'A3722' )