数据库批量更新事务速度奇慢为啥

StalkerCN 发布于 2014/07/19 02:39
阅读 1K+
收藏 0
$this->db->trans_start();
                foreach($batches as $batch)//$batches数组有10000多条记录
                {
                         $this->db->where('id'=>$batch->id)->from('table');
                         $count = $this->db->count_all_results();
                         if($count > 0)
                         {
                               $this->db->update($batch)->where('id'=>$batch->id);//如果记录存在则更新
                         }else
                         {
                               $this->db->insert('table', $batch);//如果不存在就插入新纪录
                         }
                }
                $this->db->trans_complete();


最新测试的情况  就算不使用事务  在数据库客户端上允许的速度都是很快的  10000条大概只需要4秒左右  但是在项目中运行就又回到了200多秒  效率相差几十倍  

是php的问题还是sql的问题?

加载中
0
习家家天下
我记得innodb引擎的select count是很慢的
0
幽烛
幽烛
可以用 存储过程+临时表+批量查询更新 
0
StalkerCN
StalkerCN
换了存储过程还是一样  只要执行事务就会变得很慢很慢。。。
0
红星xx
红星xx

代码写的很菜 ,$batches那么大 ,先不说 循环 10000次  ,关键的是循环一次就要查询一下数据库 ,查询了 10000 次数据库。

来 10000 次 ,自然慢 ,加上还有事物的处理 ,不慢才怪。

不关事物的事 ,代码太烂。

0
StalkerCN
StalkerCN

引用来自“红星xx”的评论

代码写的很菜 ,$batches那么大 ,先不说 循环 10000次  ,关键的是循环一次就要查询一下数据库 ,查询了 10000 次数据库。

来 10000 次 ,自然慢 ,加上还有事物的处理 ,不慢才怪。

不关事物的事 ,代码太烂。

求教如果是大侠你该怎么写?

数据是用phpexcel从上传的xlsx文件里解析出来的  因为格式不太规范 需要解析为数组 然后处理为数据库需要的格式再进行导入  导入的时候也需要对数据库原有数据进行判断  所以从逻辑上说这恐怕是不可避免的  so 如何不进行select count查询而直接进行事务处理(插入更新)?  

0
0-1
0-1
try replace into
0
realanan
realanan
楼上正解
返回顶部
顶部