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行
答案 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' )