0
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 行

结果截图

4

3 回答 3

0

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

DELETE (What?)
FROM item_measurement
WHERE measurement_id IN
(SELECT -id FROM invoice_item
WHERE invoice_id = 'A3722')
于 2013-11-06T03:49:35.810 回答
0

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

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

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

像这样修改。这使用索引:

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 说使用联接而不是使用子查询的原因。

于 2013-11-06T03:53:29.807 回答
-1
DELETE FROM `item_measurement` WHERE `measurement_id` in ( SELECT `id` as measurement_id FROM `invoice_item` WHERE `invoice_id` = 'A3722' )
于 2013-11-06T03:58:22.340 回答