百万数据入库

Posted npb1026

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百万数据入库相关的知识,希望对你有一定的参考价值。

<?php
$sql="insert into users(username,kinfname,fationname,usertioe) values ";
   //php7.2手册 封装方法 获取随机数(方法里搜索rand)
    function generateRandStr($length)
        $randstr = "";
        for($i=0; $i<$length; $i++)
            $randnum = mt_rand(0,61);
            if($randnum < 10)
                $randstr .= chr($randnum+48);
            else if($randnum < 36)
                $randstr .= chr($randnum+55);
            else
                $randstr .= chr($randnum+61);
            
        
        return $randstr;
    
//设置超时时间
set_time_limit(3600);
ini_set(‘memory_limit‘, ‘1024M‘);
//上半截sql语句
$sql="insert into users(username,kinfname,fationname,usertime) values ";
for ($i=0;$i<1000000;$i++)
    $rand=generateRandStr(6);
    $name=generateRandStr(10);
    $time=time();
    //循环后半截sql语句 拼接
    $sql.="(‘".$i."[email protected]‘,‘".$rand."‘,‘".$name."‘,‘".$time."‘),";

//去掉最后的逗号
$sql=substr($sql,0,-1);
//连接数据库
$link="mysql:host=127.0.0.1;dbname=1703plus";
$pdo= new PDO($link,‘root‘,‘root‘);
//执行语句
$pdo->exec($sql);
?>

 

 
 
 
 
-------------------------------
 
运行上述代码需要注意的操作除了代码标红的地方还需要注意以下
入库10W条数据报错如下:
技术图片
原因是:mysql中的max_allowed_packet 设置过小导致记录写入失败
解决方案是:
1、查看当前最大支持多少M
show VARIABLES like ‘%max_allowed_packet%‘;
技术图片
表示支持1M,所以需要进行修改
 
2、修改:set global max_allowed_packet = 20*1024*1024 这里改的是20M
 
那么入库100W条数据应该怎么处理呢?
 
只需设置set global max_allowed_packet = 100*1024*1024即可
设置完要关闭Navicat重新进入执行才能看到效果
 
 
----------------------------------------
 
慢查询开启状态 show VARIABLES LIKE ‘slow_query_log%‘;
设置开启慢查询 SET GLOBAL slow_query_log = ‘ON‘;
设置慢查询超过1秒钟记录 SET GLOBAL long_query_time=1
设置完要关闭Navicat重新进入执行才能看到效果
 
----------------------------------------
对于百万级数据表的优化考虑建索引,如果查询时间还是有点长,那么考虑把存储引擎改成InnoDb

以上是关于百万数据入库的主要内容,如果未能解决你的问题,请参考以下文章

百万级数据实现PDO入库

百万级数据实现PDO入库

java Spring 的JDBCTemplet批量入库数据时如果有一条数据入库不成功,其他的数据还会入库吗

Oracle处理Clob类型数据入库(String入库)

java如何将所有要入库的数据全部转为大写?

Session 入库