Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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更新_Mysql_Database_Sql Update - Fatal编程技术网

除了循环之外,我如何加快mysql更新

除了循环之外,我如何加快mysql更新,mysql,database,sql-update,Mysql,Database,Sql Update,我必须从一个数据库中读取460000条记录,然后在另一个数据库中更新这些记录。目前,我读取了select*from中的所有记录。。。然后循环遍历它们,为每个记录向第二个数据库发送更新命令。这个过程比我希望的要慢,我想知道是否有更快的方法。我通过表中索引主键的一列来匹配记录 谢谢。我可能会优化读取,例如setFetchSize250,以及写入,例如批量大小为250条记录。1。使用多重查询 啊哈“另一个数据库”表示远程数据库。。在这种情况下,您应该减少与远程数据库的交互次数。我建议使用多重查询。e、

我必须从一个数据库中读取460000条记录,然后在另一个数据库中更新这些记录。目前,我读取了select*from中的所有记录。。。然后循环遍历它们,为每个记录向第二个数据库发送更新命令。这个过程比我希望的要慢,我想知道是否有更快的方法。我通过表中索引主键的一列来匹配记录


谢谢。

我可能会优化读取,例如setFetchSize250,以及写入,例如批量大小为250条记录。

1。使用多重查询 啊哈“另一个数据库”表示远程数据库。。在这种情况下,您应该减少与远程数据库的交互次数。我建议使用多重查询。e、 g一次执行1000次更新

$cnt = 1;
for ($row in $rows)
{
    $multi_query .= "UPDATE ..;";

    if ($cnt % 1000 == 0)
    {
        mysql_query($multi_query);
        $cnt = 0;
        $multi_query = "";
    }
    ++$cnt;

}
出于安全原因,通常禁用多查询功能以使用多查询

PHP: C API: VB:我不是VB用户,所以不确定这是否适用于VB的多查询 2.使用事先准备好的语句 当您已经在使用准备好的stmt时。跳过这个

您正在运行460K个相同的结构化查询。所以,如果您使用PREPARED语句,您可以获得两个好处

减少查询编译时间 没有准备好的stmt。所有查询都被编译,但只有一次使用准备好的stmt。 降低网络成本 假设每个更新查询的长度为100字节,并且有4个参数,每个参数的长度为4字节 无准备stmt:100字节*460K=46M 准备stmt:16字节*460K=7.3M 它不会显著减少
下面是如何在VB中使用prepared语句。

我假设您的另一个数据库位于单独的服务器上,因此不能直接连接

关键是拥有更少的update语句。将数据插入新表通常会更快,如下所示:

create table updatevalues ( id int(11), a int(11), b int(11), c int(11) );
insert into updatevalues (id,a,b,c) values (1,1,2,3),(2,4,5,6),(3,7,8,9),...
update updatevalues u inner join targettable t using (id) set t.a=u.a,t.b=u.b,t.c=u.c;
drop table updatevalues;
将插入内容批处理到可以容纳的语句中,无论配置的最大大小有多大,通常以兆字节为单位

或者,查找唯一值并一起更新:

update targettable set a=42 where id in (1,3,7);
update targettable set a=97 where id in (2,5);
...
update targettable set b=1 where id in (1,7);
...

我最后做的是使用循环将查询连接在一起。因此,我不会一次发送一个查询,而是一次发送一个以分号分隔的组:

update sometable set x=1 where y =2; update sometable set x = 5 where y = 6; etc...
这最终使我的时间缩短了约40%。我的更新从3分23秒变为2分1秒

但是有一个阈值,当字符串变得太长时,将太多的字符串连接在一起会再次降低速度。所以我不得不调整它,直到找到合适的组合。结果是100个字符串连接在一起,提供了最好的性能


感谢您的回复。

您能显示数据库模式和更新查询吗?回答起来太模糊了。您可以根据表和/或结果集之间的联接进行相关更新,但我必须查看您的查询以获取更新的基础,然后是您每次处理的更新。。。即使隐藏任何可能是专有的东西是不公平的,但足以让我们理解、仔细思考并给你一些可以使用的东西。然后获取记录的计数,并使用updatetable2seta=1、b=2、c=3(其中id=table1.id-next)为下一个循环运行一个循环。ID被索引为主键。是,第二个表位于另一个数据库中。一个数据库在服务器上,另一个在本地计算机上。我正在使用vb.net,所以我不理解您的示例。不过我会研究多重查询。