我目前正在使用以下内容更新我的表格:
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新手,我不确定最好的方法。
我的表可能有多行,其中League / Matches / Line字段相同。通常,这些行上的InDict字段将为“是”。但是,如果其中一个是“否”,我需要将具有相同的League / Matches / Line列的所有其他行更新为“No”(因此它们都具有值“No”)。
使用Mysql更新语句中的连接而不是子查询会更有效吗?
如何使用联接来完成?
答案 0 :(得分:1)
我认为连接应该更快,但它取决于索引和其他东西,你应该自己尝试看看哪个表现更好(并且可能使用解释来分析查询)。
至于语法,其中任何一个都应该有效:
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 :(得分:0)
由" jpw"给出的更新连接查询你可以使用它是正确的,我不想重复。话虽如此,我只想发布连接比子查询更快,特别是如果你想更新40K +行。以下是来自MySQL文档的数据说的相同。
LEFT [OUTER] JOIN可能比同等的子查询更快,因为服务器可能能够更好地优化它 - 这一事实并非仅针对MySQL Server。在SQL-92之前,外连接不存在,因此子查询是执行某些操作的唯一方法。今天,MySQL Server和许多其他现代数据库系统提供了广泛的外连接类型。 MySQL Server支持多表DELETE语句,可用于根据一个表甚至多个表中的信息同时有效地删除行。还支持多表UPDATE语句。请参见第13.2.2节“删除语法”和第13.2.10节“更新语法”。
来源:http://dev.mysql.com/doc/refman/5.1/en/rewriting-subqueries.html