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

  • 相关阅读:
    php中如何实现在线网友
    用php与mysql的电子贺卡代码
    基于PHP MySQL的聊天室设计
    xml php动态载入与分页
    模拟OICQ的实现思路和核心程序
    FC4下安装plog快速指南(plog版本:1.01)
    一个简单的php在线端口扫描器
    UVA 10604 Chemical Reaction(六维dp数组)
    HDU 1503 Advanced Fruits
    hust 1607 Triangles(经典好题)
  • 原文地址:https://www.cnblogs.com/lcxin/p/11527565.html
Copyright © 2011-2022 走看看