• 今天,在项目中碰到了,需要把大量数据插入到mysql数据库中,把方法给大家分享一下: 程序在数据插入环节消耗了大量的资源,导致运行时间超时,解决方法mysql一条SQL语句插入多条数据。 代码如下: INSERT ...

    今天,在项目中碰到了,需要把大量数据插入到mysql数据库中,发现程序在数据插入环节消耗了大量的资源,导致运行时间超时。

    解决方法:mysql批量出入数据(一条SQL语句插入多条数据)

    代码如下:

    INSERT INTO users(name, age)  VALUES(‘php’, 25), (‘mysql’, 50), (‘大数据量’, 600);

    向users表中连续插入了3条记录。值得注意的是,上面的INSERT语句中的VALUES后必须每一条记录的值放到一对(…)中,中间使用”,”分割。

    在插入环节这样操作后,执行时间缩短了很多。

    展开全文
  • PHP 插入大数据优化

    2019-06-16 05:04:57
    2019独角兽企业重金招聘Python工程师标准>>> ...
        /*public function index()
        {
            set_time_limit(0);
    
            $time1 = microtime(true);
    
            for ($i=200001; $i<300000; $i++) {
    
                $sql = "insert into think_test(name) values ($i)";
                Db::query($sql);
    
            }
    
            $time2 = microtime(true);
    
            echo $time1-$time2; //42.355000019073s
        }*/
    
        public function index()
        {
            set_time_limit(0);
    
            $time1 = microtime(true);
    
            $sql = "insert into think_test(name) values ";
            for ($i=0; $i<1000000; $i++) {
    
                $sql .= "($i),";
            } //insert into think_test(name) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),
    
            //insert into think_test(name) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)
            $sql = substr($sql, 0, -1);
    
            Db::query($sql);
    
            $time2 = microtime(true);
    
            echo $time2-$time1; //5s
        }
    
        /**
         *
         * @DESC: 循环插入1000000 条数据 只需要5s左右 批量插入
         *
         * @author: HX
         * @Time: 2018/9/26   12:00
         *
         */
        public function index2()
        {
            set_time_limit(0);
    
            $time1 = microtime(true);
    
            //循环插入一百万
            for ($i=10000; $i <10010000 ; $i+=10000) {
                # code...
                $j = $i-10000;
                $sql = "insert into think_test(name) values ";
                for ($y=$j; $y<$i; $y++) {
    
                    $sql .= "($y),";
                }
                $sql = substr($sql, 0, -1);
    
                Db::query($sql);
                unset($sql);
            }
    
            $time2 = microtime(true);
    
            echo $time2-$time1;
        }

     

    转载于:https://my.oschina.net/u/2494575/blog/2221367

    展开全文
  • 1. 上传大文件 /* 以1.5M/秒的速度写入文件,防止一次过写入文件过大导致服务器出错(chy/20150327) */ $is_large_file = false; if( strlen($xml_str)>=2097152 ){ //当文件大于2M ... ...

    1. 上传大文件

            /* 以1.5M/秒的速度写入文件,防止一次过写入文件过大导致服务器出错(chy/20150327) */
            $is_large_file = false;
            if( strlen($xml_str)>=2097152 ){ //当文件大于2M
                $is_large_file = true;
                
                fwrite($fp, $pre, strlen($pre)); //写入头部
                $start = 0;
                while( $content=mb_strcut($xml_str,$start,1572864) ){
                    $start = $start + 1572864;
                    $writeResult = fwrite($fp, $content, strlen($content));
                    if( !$writeResult ){
                        unlink($filename);
                        break;
                    }
                    sleep(1);
                    unset($content);
                }
                unset($xml_str);
                fwrite($fp, $end, strlen($end)); //写入尾部
            }else{
                $content = $pre.$xml_str.$end;
                fwrite($fp, $content, strlen($content));
            }

     

    2. 处理大数据的加密

        //aes加密
        public function aesEncode_large($info) {
            //.....(省略部分代码)

        if(mcrypt_generic_init($cipher, $this->aesKey, $this->aesIv) != -1){ //$cipherText = mcrypt_generic($cipher, $beianInfo); //原普通的加密方式(chy/20150327) //处理大字符串加密。temp.text主要用于文件缓存(chy/20150327) $filename = B_ROOT."/admin/temp/temp.txt"; file_put_contents($filename,''); //将文件清空 $fp = fopen($filename, 'wb'); while( $content=mb_strcut($info,$start,104800) ){ $start = $start + 104800; $cipherTextCut = mcrypt_generic($cipher, $content); fwrite($fp, $cipherTextCut, strlen($cipherTextCut)); unset($cipherTextCut); unset($content); } mcrypt_generic_deinit($cipher); mcrypt_module_close($cipher); fclose($fp); return true; } else { return false; } }

     

    转载于:https://www.cnblogs.com/chy1000/p/4372566.html

    展开全文
  • 使用 PHP 往里面不停地以每次插入 10000 个文档,一共需要插入 1E 左右个文档。 在插入中,2 个 SECONDARY 全部状态为 Recovering,错误信息:”errmsg” : “error RS102 too stale to catch up”

    转载


    看看问题

    我在做这样一个测试:架设 Replica Set,有 3 个节点,运行于同台机器的3个不同端口。使用 PHP 往里面不停地以每次插入 10000 个文档,一共需要插入 1E 左右个文档。
    在插入中,2 个 SECONDARY 全部状态为 Recovering,错误信息:”errmsg” : “error RS102 too stale to catch up”。并且在插入7000W左右文档时(并不表示在 7000W 数据后才发生),发现插入速度变的很不稳定:

    >mongo insert in 2.1298868656158 Secs. memory 164.25 MB
    >mongo insert in 61.71651506424 Secs. memory 164.25 MB
    >mongo insert in 2.6970100402832 Secs. memory 164.25 MB
    >mongo insert in 58.021383047104 Secs. memory 164.5 MB
    >mongo insert in 43.900979042053 Secs. memory 165 MB
    >mongo insert in 26.911059856415 Secs. memory 164 MB
    >mongo insert in 49.29422211647 Secs. memory 164.25 MB

    该如何处理?

    幸运的是官方文档 Resyncing a Very Stale Replica Set Member 告诉了问题所在,OPLOG(operation log 的简称)。OPLOG 是用于 Replica Set的 PRIMARY 和 SECONDARY 之间同步数据的系统 COLLECTION。OPLOG 的数据大小是有峰值的,64 位机器默认为 ~19G(19616.9029296875MB),通过 db.printReplicationInfo() 可以查看到:

    configured oplog size: 19616.9029296875MB (OPLOG 大小)
    log length start to end: 15375secs (4.27hrs) (OPLOG 中操作最早与最晚操作的时间差)
    oplog first event time: Thu Jul 07 2011 21:03:29 GMT+0800 (CST)
    oplog last event time: Fri Jul 08 2011 01:19:44 GMT+0800 (CST)
    now: Thu Jul 07 2011 17:20:16 GMT+0800 (CST)

    要了解上面参数更详细的含义可以看下 mongo_vstudio.cpp 源代码, JS 的噢

    https://github.com/mongodb/mongo/blob/master/shell/mongo_vstudio.cpp

    当 PRIMARY 有大量操作的时候,OPLOG 里就会插入相应的大量文档。每条文档就是一个操作,有插入(i)、更新(u)、删除(d)。

    test:PRIMARY> db.oplog.rs.find()
    { “ts” : { “t” : 1310044124000, “i” : 11035 }, “h” : NumberLong(“-2807175333144039203″), “op” : “i”, “ns” : “cas_v2.cas_user_flat”, “o” : { “_id” : ObjectId(“4e15afdb1d6988397e0c6612″), … } }
    { “ts” : { “t” : 1310044124000, “i” : 11036 }, “h” : NumberLong(“5285197078463590243″), “op” : “i”, “ns” : “cas_v2.cas_user_flat”, “o” : { “_id” : ObjectId(“4e15afdb1d6988397e0c6613″), … } }

    ts: the time this operation occurred.
    h: a unique ID for this operation. Each operation will have a different value in this field.
    op: the write operation that should be applied to the slave. n indicates a no-op, this is just an informational message.
    ns: the database and collection affected by this operation. Since this is a no-op, this field is left blank.
    o: the actual document representing the op. Since this is a no-op, this field is pretty useless.

    由于 OPLOG 的大小是有限制的,所以 SECONDARY 的同步可能无法更上 PRIMARY 插入的速度。这时候当我们查看 rs.status() 状态的时候就会出现 “error RS102 too stale to catch up” 的错误。

    If this occurs, the slave will start giving error messages about needing to be resynced. It can’t catch up to the master from the oplog anymore: it might miss operations between the last oplog entry it has and the master’s oldest oplog entry. It needs a full resync at this point.

    解决办法:
    Resyncing a Very Stale Replica Set Member 给出了当我们遇到 Error RS102 错误时,该做些什么事。还可以根据 Halted Replication 中的 Increasing the OpLog Size ,调整 OPLOG 的大小为适当的值。

    This indicates that you’re adding data to the database at a rate of 524MB/hr. If an initial clone takes 10 hours, then the oplog should be at least 5240MB, so something closer to 8GB would make for a safe bet.

    最后在数据继续插入的情况下,使用 rs.remove() 移除 2 个SECONDARY 后,插入又恢复了原来的速度。剩下就是插完后再重新同步 SECONDARY。

    >mongo insert in 0.62605094909668 Secs. memory 164.25 MB
    >mongo insert in 0.63488984107971 Secs. memory 164 MB
    >mongo insert in 0.64394617080688 Secs. memory 164.25 MB
    >mongo insert in 0.61102414131165 Secs. memory 164 MB
    >mongo insert in 0.64304113388062 Secs. memory 164.25 MB

    一些解释

    Replica Set status状态说明:

    0 Starting up, phase 1
    1 Primary
    2 Secondary
    3 Recovering
    4 Fatal error
    5 Starting up, phase 2
    6 Unknown state
    7 Arbiter
    8 Down

    health 健康度:

    0 Server is down
    1 Server is up

    展开全文
  • 直接在命令行运行php (设置php最大运行时间为0, 设置php执行内存为-1) max_execution_time = 0 php内存占用 ­1为不限 memory_limit = -1 mysql 内存执行 max_allowed_packet = 10000M ...

    直接在命令行运行php (设置php最大运行时间为0, 设置php执行内存为-1)
    max_execution_time = 0
    php内存占用 ­1为不限
    memory_limit = -1
    mysql 内存执行
    max_allowed_packet = 10000M

    展开全文
  • 因为框架对速度的极大影响,所以这里进行大数据插入的时候,将使用原生代码进行,尽量避免其他因素对数据插入的影响。代码:百万数据结果:生产第1批20000条数据耗时:0.001秒 InnoDB第1批插入20000条数据耗时0.183...
  • <p>when i run insert query through php if the data which is going to store in bcontent is small (2-3 lines paragraph) then that query runs successfully but when the size of that data is increases (10-...
  • 数据库数据同步,迁移等其他操作时,会涉及到数据的转移,插入操作。如果是千万级别的数据操作,那么怎样提高插入效率呢??可能有人会说,用load方法简单高效。是的,但是如果是不同数据库之间的同步插入该怎么解决...
  • 本文讲的是mysql大数据分库和分表 php解决方案。 mysql分库分表方案、mysql 分库方案、php实现mysql分库分表、mysql高并发解决方案。
  • 但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显。但是,生成器功能的确非常有用。 优点 直接讲概念估计你听完还是一头雾水,所以我们先来...
  • PHP插入百万数据教程目录介绍新建数据库和表修改数据库配置编写代码查看效果总结 目录 介绍 在实际开发中,尤其是电商,会遇到插入百万数据这个问题,要是用for循环一条一条插入会很浪费数据库资源和效率很低,博主在...
  • 1.PHP代码 [php] view plain copy   $t=mktime();  set_time_limit(1000);  $myFile="c:/insert.sql";  $fhandler=fopen($myFile,'wb');  if($fhandler){    $i=0; 
  • Mongodb大数据语法大全

    2017-12-12 19:57:16
    JSON和MONGODB JSON不止是一种交换数据的方式,也是一种存储数据的良好方式,实际上MONGODB并未使用JSON存储数据,而是使用由MONGODB团队开发的一种称为BSON的开放数据格式。 面向文档存储BSON ...
  • 不管是日常业务数据处理中,还是数据库的导入导出,都可能遇到需要处理大量数据的插入插入的方式和数据库引擎都会对插入速度造成影响,这篇文章旨在从理论和实践上对各种方法进行分析和比较,方便以后应用中插入...
  • 今天服务器突然出现接收不到数据 ,拿curl写了个测试脚本,...开始调试,打开了php的错误日志,并没有发现任何错误信息,检查了下php的post的相关配置,配得都挺高也没有任何问题。 继续往下找原因,查看nginx的错误日
  • [code="java"] public partial class ASP_NET : System.Web.UI.Page { private DateTime startTime; string connString = "... protected void Button1_Click(object sender, EventArgs e) ...
  • 首先新建PHP文件 在thinkphp/library/think下新建Csv.php <?php namespace think; class Csv { //导出csv文件 public function put_csv(&$data, $titleList = array(), $fileName = '') { ini_s...
  • 1.php代码 <?php $t=mktime(); set_time_limit(1000); $myFile="c:/insert.sql"; $fhandler=fopen($myFile,'wb'); if($fhandler){ $i=0; while($i)//1,0000,000 { $i++; $sql="$i\t'bb'"; fwrite
  • import java.util.ArrayList; import java.util.List; public class FenDuan { /** * @param args */ public static void main(String[] args) { //1.总记录数 List oldList = new ArrayList... for (i
1 2 3 4 5 ... 20
收藏数 5,456
精华内容 2,182