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)然后重启环境就可以了

  • 相关阅读:
    LightOJ 1132 Summing up Powers(矩阵快速幂)
    hdu 3804 Query on a tree (树链剖分+线段树)
    LightOJ 1052 String Growth && uva 12045 Fun with Strings (矩阵快速幂)
    uva 12304 2D Geometry 110 in 1! (Geometry)
    LA 3263 That Nice Euler Circuit (2D Geometry)
    2013 SCAUCPC Summary
    poj 3321 Apple Tree (Binary Index Tree)
    uva 11796 Dog Distance (几何+模拟)
    uva 11178 Morley's Theorem (2D Geometry)
    动手动脑
  • 原文地址:https://www.cnblogs.com/lcxin/p/11527565.html
Copyright © 2011-2022 走看看