zoukankan      html  css  js  c++  java
  • PHP实现插入100万条数据优化

    第一种方法一条一条执行插入,结果会很慢

    <?php
    
    
    header("Content-Type:text/html;charset=utf-8");
    date_default_timezone_set("PRC");
    $servername = "localhost";
    $port = 3306;
    $username = "root";
    $password = "root";
    $dbname = "charu";
    
    // 创建数据库连接
    $conn = new mysqli($servername, $username, $password, $dbname, $port);
    
    // 检测连接
    if ($conn->connect_error) {
     die("connect failed: " . $conn->connect_error);
    } 
    
    // 第一种,一条一条插入,结果要2分多钟
    $costBegin = time();
    echo date('Y-m-d H:s:i',$costBegin)."<br>";
    for($i=0;$i<1000000;$i++){
        $sql = sprintf("INSERT INTO charu (name, age) VALUES ( '%s', %d);", '测试', 10);
        $conn->query($sql);
    }
    
    $costEnd = time();
    echo date('Y-m-d H:s:i',$costEnd)."<br>";
    $cost = $costEnd - $costBegin;
    echo date('Y-m-d H:s:i',$cost)."<br>";
    
    $conn->close();

     

    第二种使用insert合并插入

    mysql里面是可以使用insert语句进行合并插入的,比如

    INSERT INTO charu (name, age) VALUES ('name1', 18), ('name2', 19);

    表示一次插入两条数据

    <?php
    
    
    header("Content-Type:text/html;charset=utf-8");
    date_default_timezone_set("PRC");
    $servername = "localhost";
    $port = 3306;
    $username = "root";
    $password = "root";
    $dbname = "charu";
    
    // 创建连接
    $conn = new mysqli($servername, $username, $password, $dbname, $port);
    
    // 检测连接
    if ($conn->connect_error) {
     die("connect failed: " . $conn->connect_error);
    } 
    
    // 第二种,把所有要插入的数据生成为一条sql语句,所以执行的时间会快很多,测试时间是5秒多,服务器配置不同会影响时间
    $costBegin = time();
    echo date('Y-m-d H:s:i',$costBegin)."<br>";
    $sql = sprintf("INSERT INTO charu (name, age) VALUES ");
    for($i=0;$i<1000000;$i++){
          $itemStr = '( ';
          $itemStr .= sprintf("'%s', %d", '测试', 10);
          $itemStr .= '),';
          $sql .= $itemStr;
    }
    // 去除最后一个逗号,并且加上结束分号
    $sql = rtrim($sql, ',');
    $sql .= ';';
    if ($conn->query($sql) === TRUE) {
        echo "新记录插入成功". "<br>";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
    
    $costEnd = time();
    echo date('Y-m-d H:s:i',$costEnd)."<br>";
    $cost = $costEnd - $costBegin;
    echo date('Y-m-d H:s:i',$cost)."<br>";
    
    $conn->close();

    使用第二种方法有可能会出现

    MySQL server has gone away错误的解决办法

    而我自己是直接在my.ini文件里面直接添加(max_allowed_packet = 30M)然后重启环境就可以了

  • 相关阅读:
    ESP8266 wifi钓鱼
    九,ESP8266 判断是断电上电(强制硬件复位)之后运行的内部程序还是内部软件复位之后运行的程序(基于Lua脚本语言)
    关于Http 传输二维json
    Android6.0权限大全和权限分类
    Android 多线程-----AsyncTask详解
    关于加密(转载文章)
    java基础之:匿名内部类
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    java多线程之:SynchronousQueue队列
    Hibernate之:各种主键生成策略与配置详解
  • 原文地址:https://www.cnblogs.com/lcxin/p/11527565.html
Copyright © 2011-2022 走看看