Heim >Backend-Entwicklung >PHP-Tutorial >mysql - php大批量插入及更新的问题

mysql - php大批量插入及更新的问题

WBOY
WBOYOriginal
2016-07-06 13:54:101569Durchsuche

插入的问题

php操作大批量数据的时候,我想到的解决方法如下

方法一:foreach循环遍历中构造sql语句然后插入数据库
insert into xxx values (xxx,xxx,xxx)

方法二:foreach循环遍历构造sql语句,最后一次性插入
insert into xxx(field1,field2,field3)values(xxx1,xxx2,xxx3),(xxx1,xxx2,xxx3)

以上只是插入,如果要在插入的时候先判断插入的数据是否存在数据库中,那每一次插入之前都要进行一次select的操作,这样效率不高?如何优化蛤?

更新的问题

其实类似于上面的插入,update之前先select,如果存在就update,不存在就insert,这样sql语句依然很多,如何优化呢?

回复内容:

插入的问题

php操作大批量数据的时候,我想到的解决方法如下

方法一:foreach循环遍历中构造sql语句然后插入数据库
insert into xxx values (xxx,xxx,xxx)

方法二:foreach循环遍历构造sql语句,最后一次性插入
insert into xxx(field1,field2,field3)values(xxx1,xxx2,xxx3),(xxx1,xxx2,xxx3)

以上只是插入,如果要在插入的时候先判断插入的数据是否存在数据库中,那每一次插入之前都要进行一次select的操作,这样效率不高?如何优化蛤?

更新的问题

其实类似于上面的插入,update之前先select,如果存在就update,不存在就insert,这样sql语句依然很多,如何优化呢?

1- Mysql还有一种语法是 REPLACE INTO,存在就更新,否则插入
2- Mysql还有一种语法是 INSERT INTO ... ON DUPLICATE KEY UPDATE,存在唯一键键冲突就更新
3- 实际开发中大批量数据插入是很罕见的,至少1000条以下肯定不算大批量,所以如果你是想省事的话,通常你会验证一时偷懒节约了4小时所引起的麻烦够你折腾8小时这个预言。

通常大批量数据插入发生在数据从旧数据库中导入,但是这种导入通常只有一次,所以怎么认真对待都不为过,其它的比如从上传的csv文件中导入数据需要看具体的业务逻辑,比较常见的是使用try/catch进行插入,失败的数据显示出来,让用户确认覆盖,然后再update。

1)如果能保证insert肯定没有数据重复,那肯定是insert更合适
2)索引~,恰当的索引真的对提升性能有很大帮助
3)用mysql的批处理导入,对性能提升有一定帮助,但缺点是可能会丢数据。
4)把自动commit=true也就是事务关闭,每提交若干个(打比方1W条记录)之后集中commit一次,速度能有很大提升,单机差不多好点的配置1W QPS也是很轻松的
5)从新设计mysql库,读写分离,做集群,上SSD...

REPLACE 存在则删除插入 或者 DUPLICATE 存在则更新

可以用replace 就可以解决update和insert的烦恼

on duplicate key update 用这个,每不想重复的字段建唯一索引,这样就不用你查一下在选择插入还是更新了。他可以做到当重复时会自动执行UPDATE后面的语句

不一定要用REPLACE和DUPLICATE吧,可以试试:
开启事务,循环插入,如果插入失败,则改为更新.

<code><?php $db = new mysqli('127.0.0.1','user','pass','dbname',3306);
$db->query('SET AUTOCOMMIT=0');
$db->query('START TRANSACTION');
//开始循环
if(!$db->query('INSERT INTO posts(id, post_title, post_content) VALUES(1,"title_1","content_1")')) {
    $db->query('UPDATE posts SET post_title = "title_1", post_content = "content_1" WHERE id = 1');
}
//插入失败,或者没有AUTO_INCREMENT字段,或者不是INSERT语句,insert_id为0.
echo $db->insert_id;
$db->query('COMMIT');
$db->query('SET AUTOCOMMIT=1');</code>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn