Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 一次发出多个sql update语句_Mysql_Sql - Fatal编程技术网

Mysql 一次发出多个sql update语句

Mysql 一次发出多个sql update语句,mysql,sql,Mysql,Sql,我必须以以下形式发出大约1M个sql查询: update table1 ta join table2 tr on ta.tr_id=tr.id set start_date=null, end_date=null where title_id='X' and territory_id='AG' and code='FREE'; sql语句位于文本文档中——我只能按原样复制粘贴它们 最快的方法是什么?是否有一些我可以禁用的检查,以便它只在末尾插入它们?例如: start transactio

我必须以以下形式发出大约1M个sql查询:

update table1 ta join table2 tr on ta.tr_id=tr.id 
set start_date=null, end_date=null 
where title_id='X' and territory_id='AG' and code='FREE';
sql语句位于文本文档中——我只能按原样复制粘贴它们

最快的方法是什么?是否有一些我可以禁用的检查,以便它只在末尾插入它们?例如:

start transaction;
copy/paste all sql statements here;
commit;

我尝试了上述方法,但发现插入件的速度提高为零。还有什么我可以尝试的吗?

性能成本部分归因于运行1M个单独的SQL语句,但也归因于重写行和相应索引的成本

我的意思是,执行SQL语句有几个步骤,每个步骤都需要非零的时间:

  • 开始一项交易
  • 解析SQL,验证语法,检查您的权限以确保您有权更新这些表,等等
  • 更改行中更新的值
  • 更改该表中包含所更改列的每个索引中更新的值
  • 提交事务
  • 在自动提交模式下,每个SQL语句都会隐式地执行start&commit事务,因此会导致最大的开销。如您所示,使用explict START和COMMIT可以通过每次执行一次来减少开销

    警告:我通常不会在一个事务中运行1M更新。这会导致其他类型的开销,因为MySQL需要保留原始行以防回滚。作为折衷方案,我可能会执行1000次更新,然后提交并启动一个新事务。这至少将启动/提交开销减少了99.9%

    在任何情况下,事务的开销都不是很大。与更新索引的成本相比,这可能是不明显的

    MyISAM表有一个禁用键的选项,这意味着它不必在事务期间更新非唯一索引。但这对您来说可能不是一个好的优化,因为(a)您可能需要索引处于活动状态,以帮助执行WHERE子句和联接中的查找;(b)它在默认存储引擎InnoDB中不起作用,最好使用InnoDB

    如果表中有太多索引或冗余索引,您也可以查看。拥有不需要的额外索引毫无意义,这只会增加更新的成本

    还有一种可能是您没有足够的索引,并且更新速度很慢,因为它正在对每个语句进行表扫描。表扫描可能非常昂贵,因此最好创建所需的索引来优化查找。您应该使用EXPLAIN来查看UPDATE语句是否得到了很好的优化


    如果您想让我检查一下,请为更新中的每个表运行
    showcreatetable
    ,并为示例SQL语句运行
    explainupdate…
    。将输出添加到上面的问题中(请不要粘贴评论)。

    有什么方法可以将它们合并到一个更新中吗?你在做什么有什么模式吗?@Barmar不确定,但这些语句来自excel。它们都测试相同的列吗?确保它们上有多列索引。