簡體   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