繁体   English   中英

在MySQL更新语句中使用联接而不是子查询

[英]Using a join in Mysql update statement instead of sub-query

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

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字段将为“是”。 但是,如果其中之一为“否”,我需要将具有相同“联赛” /“比赛” /“线”列的所有其他行也更新为“否”(因此它们的值均为“否”)。

在MySQL更新语句中使用联接而不是子查询会更有效吗?

如何使用联接做到这一点?

我认为联接应该更快,但是它依赖于索引编制和其他操作,您应该自己尝试一下,看看哪个性能更好(也许可以使用解释来分析查询)。

至于语法,任何这些都应该起作用:

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"

“ jpw”给出的更新联接查询是正确的,您可以使用它,我不想重复。 话虽如此,我只想发布联接显然比子查询快,尤其是如果您要更新40K +行。 下面是来自MySQL文档的数据说的差不多。

LEFT [OUTER] JOIN可以比等效的子查询更快,因为服务器可能可以更好地对其进行优化-这不仅限于MySQL Server。 在SQL-92之前,不存在外部联接,因此子查询是执行某些操作的唯一方法。 今天,MySQL Server和许多其他现代数据库系统提供了广泛的外部联接类型。 MySQL Server支持多表DELETE语句,该语句可用于基于一个表甚至是多个表的信息有效地删除行。 还支持多表UPDATE语句。 请参见第13.2.2节“删除语法”和第13.2.10节“ UPDATE语法”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM