首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mysql update语句中使用联接而不是子查询。

在Mysql update语句中使用联接而不是子查询。
EN

Stack Overflow用户
提问于 2015-02-11 21:42:16
回答 2查看 53关注 0票数 0

我目前正在使用以下内容更新我的表:

代码语言:javascript
复制
UPDATE Check_Dictionary 
               SET InDict = "No" WHERE (Leagues, Matches, Line) IN (SELECT * FROM (
               SELECT Leagues, Matches, Line FROM Check_Dictionary 
               WHERE InDict = "No")as X)

但是,当我拥有大型数据集(40k+行)时,这似乎相当低效/缓慢。我正在进行的所有搜索都表明,与子查询相比,联接对于这类事情要有效得多。但是,作为mysql新手,我不确定最好的方法是什么。

我的表可能有多行,其中联赛/比赛/线字段是相同的。通常,这些行上的InDict字段将为“是”。但是,如果其中之一是"No“,我需要使用相同的League/Matches/Line列更新所有其他行为"No”(因此它们的值都是"No")。

在Mysql update语句中使用join而不是子查询会更有效吗?

我怎样才能用一个连接来完成它呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-11 22:30:36

我认为连接应该更快,但是它取决于索引和其他东西,您应该自己尝试一下,看看哪一个性能更好(也许可以使用explain来分析查询)。

至于语法,任何一种方法都应该有效:

代码语言:javascript
复制
UPDATE Check_Dictionary c1
JOIN (
  SELECT Leagues, Matches, Line 
  FROM Check_Dictionary 
  WHERE InDict = "No"
) AS X USING (Leagues, Matches, Line)
SET InDict = "No" 

UPDATE Check_Dictionary AS c1
JOIN Check_Dictionary AS c2 USING (Leagues, Matches, Line) 
SET c1.InDict = "No" 
WHERE c2.InDict = "No"
票数 1
EN

Stack Overflow用户

发布于 2015-02-11 22:38:17

由"jpw“提供的update查询是正确的,您可以使用它,我不想重复。话虽如此,我只想发布联接显然比子查询更快,特别是如果您想更新40K+行。下面是来自MySQL文档的数据,大致相同。

左外部联接可以比等效的子查询更快,因为服务器可能能够更好地优化它--这并不是仅针对MySQL服务器的事实。在SQL92之前,外部联接并不存在,因此子查询是执行某些事情的唯一方法。今天,MySQL服务器和许多其他现代数据库系统提供了广泛的外部连接类型。MySQL服务器支持多个表删除语句,这些语句可用于根据一个表的信息高效地删除行,甚至同时从多个表中删除行。还支持多表UPDATE语句.见第13.2.2节“删除语法”和第13.2.10节“更新语法”。

来源:http://dev.mysql.com/doc/refman/5.1/en/rewriting-subqueries.html

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

https://stackoverflow.com/questions/28465080

复制
相关文章

相似问题

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