百万级数据实现PDO入库
Posted jiangshiguo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百万级数据实现PDO入库相关的知识,希望对你有一定的参考价值。
<?php //获取随机英文字符串 function getNickname($length) $strs="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"; $name=substr(str_shuffle($strs),mt_rand(0,strlen($strs)-11),$length); return $name; //设置超时时间 set_time_limit(3600); ini_set(‘memory_limit‘, ‘1024M‘); //链接数据库 $pdo = new PDO(‘mysql:host=127.0.0.1;dbname=1703a‘,‘root‘,‘root‘); //sql前半部分 $sql = ‘insert into user (username,nickname,fname,create_at) values ‘; //循环拼接 for($i=1;$i<=100000;$i++) $nickname = getNickname(6); $fname = getNickname(10); $sql .= "(‘".$i."[email protected]‘,‘".$nickname."‘,‘".$fname."‘,‘".time()."‘),"; //去掉多余的逗号 $last_sql = substr($sql, 0, -1); // echo $last_sql; //最终的sql $pdo->exec($last_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入库的主要内容,如果未能解决你的问题,请参考以下文章
性能爆表:SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!