首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL嵌套查询运行非常慢?

问MYSQL嵌套查询运行非常慢?
EN

Stack Overflow用户
提问于 2013-01-18 00:02:53
回答 4查看 1.7K关注 0票数 3

下面的查询经常超时,有没有一种开销更小的方法来实现同样的功能?

代码语言:javascript
复制
UPDATE Invoices SET ispaid = 0 
WHERE Invoice_number IN (SELECT invoice_number
    FROM payment_allocation
    WHERE transactionID=305)

我正在做的是从事务中取消分配发票,可能会返回多达30+记录,但每次我尝试运行它时,它都会停止数据库

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-18 00:05:36

使用JOIN而不是subquery会提高性能。

在两个表中的Invoice_number列上创建索引。

试试这个:

代码语言:javascript
复制
UPDATE Invoices i 
INNER JOIN payment_allocation pa ON i.Invoice_number = pa.invoice_number 
SET i.ispaid = 0 
WHERE pa.transactionID = 305;
票数 6
EN

Stack Overflow用户

发布于 2013-01-18 00:07:09

我会试试EXISTS:

代码语言:javascript
复制
UPDATE Invoices a set ispaid=0 
WHERE EXISTS 
(
 SELECT NULL FROM payment_allocation b 
 WHERE b.Invoice_number =a.Invoice_number AND b.transactionID=305
)
票数 2
EN

Stack Overflow用户

发布于 2013-01-18 00:04:26

从MySQL 5.5开始,不能优化子查询选择(查询中的另一个完整select语句)。这可能就是您的查询如此缓慢的原因。重构查询以去除内部select语句。

代码语言:javascript
复制
 UPDATE Invoices, payment_allocation
  SET ispaid=0 
  WHERE payment_allocation.transactionID=305 AND       
        Invoices.Invoice_number = payment_allocation.invoice_number 

有趣的旁注..。但是MariaDB (最初创建者对MySQL的一个分支)已经实现了子查询选择优化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14383100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档