今天心情不错,继续来填我的爬虫项目的坑,在这里我已经拿到了优酷动漫上的数据了,大约有3000条左右。正是数据量有点多,不可能人工用手填入数据库的,不然还不累死,而且还会出错,这样子做不靠谱是最笨的方法。所以这里面我第一个想到的就是直接使用sql语句插入,一条条的插入数据库。

我的数据具体是这个样子的:

//$v[0]===>动漫简介//$v[1]===>动漫图片url//$v[2]===>动漫名称//$v[3]===>动漫外链数组

(1)直接插入 所以具体的实现代码如下:

//方法1:直接插入

foreach($json as $k=>$v){

//$v[0]===>动漫简介

//$v[1]===>动漫图片url

//$v[2]===>动漫名称

//$v[3]===>动漫外链数组

//插入数据到list表

$sql="INSERT INTO `v_list` (`id`,`type`,`title`,`img_url`,`abstract`,`episode`)

VALUES ($k,0,'$v[2]','$v[1]','$v[0]',".sizeof($v[3]).")";

if($conn->query($sql)){

echo '插入数据成功!';

}else{

die('插入数据失败:'.$conn->error);

}

foreach($v[3] as $kk=>$vv){

//插入数据到vediolist

$sql="INSERT INTO `v_vediolist` (`belong`,`vedio_url`,`title`)VALUES($k,'$vv[1]','$vv[0]')";

if($conn->query($sql)){

echo '插入数据成功!';

}else{

die('插入数据失败:'.$conn->error);

}

}

}

这种方法真的是慢,花了70秒左右。

3000条数据就70秒,那数据多起来不就等几天几夜也没录完。所以开始找另外一种方法。

(2)MySQLi预处理

//方法2:MySQLi 预处理

$stmt1 = $conn->prepare("INSERT INTO `v_list` (`id`,`type`,`title`,`img_url`,`abstract`,`episode`)

VALUES (?,?,?,?,?,?)");

$stmt2 = $conn->prepare("INSERT INTO `v_vediolist` (`belong`,`vedio_url`,`title`)VALUES(?,?,?)");

foreach($json as $k=>$v){

//$v[0]===>动漫简介

//$v[1]===>动漫图片url

//$v[2]===>动漫名称

//$v[3]===>动漫外链数组

//插入数据到list表

$ref1["id"] = $k;

$ref1["type"] = 0;

$ref1["title"] = $v[2];

$ref1["img_url"] = $v[1];

$ref1["abstract"] = $v[0];

$ref1["episode"] = count($v[3]);

$stmt1->bind_param("ddsssd",$ref1["id"],$ref1["type"],$ref1["title"],$ref1["img_url"],$ref1["abstract"],$ref1["episode"]);

$stmt1->execute();

foreach($v[3] as $kk=>$vv){

//插入数据到vediolist

$stmt2->bind_param("dss",$k,$vv[1],$vv[0]);

$stmt2->execute();

}

}这种方法其实也没有什么优化,反而是做了安全处理,反而导致更加的慢了。

结果如下图:

所以没有办法,又要找一种方法才行。之后这次的效果非常好。

(3)逗号拼接法

//方法3:逗号隔开

//INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....),(值1, 值2,....),(值1, 值2,....)

$sql1="INSERT INTO `v_list` (`id`,`type`,`title`,`img_url`,`abstract`,`episode`)VALUES";

$sql2="INSERT INTO `v_vediolist` (`belong`,`vedio_url`,`title`)VALUES";

foreach($json as $k=>$v){

//$v[0]===>动漫简介

//$v[1]===>动漫图片url

//$v[2]===>动漫名称

//$v[3]===>动漫外链数组

//插入数据到list表

$sql1.="($k,0,'$v[2]','$v[1]','$v[0]',".sizeof($v[3])."),";

foreach(@$v[3] as $kk=>$vv){

$sql2.="($k,'$vv[1]','$vv[0]'),";

}

}

//从字符串右侧移除字符

$sql1 = rtrim($sql1,',');

$sql2 = rtrim($sql2,',');

if($conn->query($sql1)){

echo '插入数据成功!';

}else{

die('插入数据失败:'.$conn->error);

}

if($conn->query($sql2)){

echo '插入数据成功!';

}else{

die('插入数据失败:'.$conn->error);

}

使用这个方法后,速度快到不要不要的,简直是指数级的优化呀。

结果如下图:

这种方法只要0.1秒左右就全部数据都导入了,速度真的是太快了。虽然好办法已经找到了,但是做技术要不断的探索才能不断进步,所以我又使用了事务的方法来导入数据。

(4)事务

方法4:事务

//关闭自动提交

$conn->autocommit(false);

foreach($json as $k=>$v){

//$v[0]===>动漫简介

//$v[1]===>动漫图片url

//$v[2]===>动漫名称

//$v[3]===>动漫外链数组

//插入数据到list表

$sql1="INSERT INTO `v_list` (`id`,`type`,`title`,`img_url`,`abstract`,`episode`)

VALUES ($k,0,'$v[2]','$v[1]','$v[0]',".sizeof($v[3]).")";

$conn->query($sql1);

foreach($v[3] as $kk=>$vv){

//插入数据到vediolist

$sql2="INSERT INTO `v_vediolist` (`belong`,`vedio_url`,`title`)VALUES($k,'$vv[1]','$vv[0]')";

$conn->query($sql2);

}

}

//上面的操作无错时执行事务提交

if(!$conn->errno){

$conn->commit();

echo 'ok';

}else{//错误的话回滚

echo 'err';

$conn->rollback();

}结果如下图:

这种方法是第3种的两倍左右,但是这个方法有个好处是可以回滚,只要有一个地方出错了,就全部都放弃不要,回到刚开始要进行插入数据时的状态。

总结:

这四种的方式第1,2是最慢的不可取,所以第3,4这两种可以自己衡量一下,数据允许出点小错误的话,那第3是一个非常好的选择,不然就第4种吧。

最后,我的视频网站上的动画栏目的数据也能运行了,效果如下:

php 爬数据库,(3)php爬虫---mysql大批数据导入数据库-4种方法比较相关推荐

  1. mysql如何通过数据库修改root_MySQL数据库之MySQL——修改root密码的4种方法(以windows为例)...

    本文主要向大家介绍了MySQL数据库之MySQL--修改root密码的4种方法(以windows为例) ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 方法1: 用SET PAS ...

  2. zipkin 禁止_MySQL数据库之zipkin使用mysql保存数据

    本文主要向大家介绍了MySQL数据库之zipkin使用mysql保存数据 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. zipkin和mysql结合保存zipkin在项目监控中 ...

  3. 通过管道传输快速将MySQL的数据导入Redis(自己做过测试)

    通过管道传输快速将MySQL的数据导入Redis 通过管道传输pipe将MySQL数据批量导入Redis       自Redis 2.6以上版本起,Redis支持快速大批量导入数据,即官网的Redi ...

  4. MySQL——修改root密码的4种方法(以windows为例)

    本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法,大家可以可以根据的自己的情况自由选择,希望对大家有所帮助 方法1: 用SET PASSWORD命令 首先登录MySQL. ...

  5. python接入excel_使用python将excel数据导入数据库过程详解

    因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接丢代码,使用python3,注释比较清楚. ...

  6. 如何将数据导入数据库

    如何将数据导入数据库 以mysql为例: 将整理的数据导入数据库中 进入mysql数据库中,mysql -u root -p 设置客户端显示的编码集: set  字段 utf8 执行sql文件:sou ...

  7. MySQL修改root密码的4种方法_MySQL修改root密码的4种方法(小结)

    方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:my ...

  8. mysql 中添加索引的三种方法

    在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以通过不同的应用场景来进行索引的新建,在此列出三种新建索引的方法 mysql 中添加索引的三种方法 1.1 新建表中添加索 ...

  9. Mysql删除数据特别慢及解决方法

    Mysql删除数据特别慢及解决方法 1.前言 笔者的mysql表数据量大概是1亿条,然后直接删除某一批次数据的时候,删除操作极其缓慢,执行了很久之后都不能删除成功.我就终止这个操作了. 2.问题 但是 ...

最新文章

  1. java订单实现的_java订单系统的开发
  2. 【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理
  3. 自己动手在 Linux 系统实现一个 everything 程序
  4. 机器学习圣杯:图灵奖得主Bengio和LeCun称自监督学习可使AI达到人类智力水平
  5. AndroidTv Home界面实现原理(二)——Leanback 库的主页卡位缩放动画源码解析
  6. (批量)备份github仓库到本地
  7. css提取页面元素唯一性_下面这个函数,能够获取一个元素的任意 CSS 属性值。...
  8. [iOS]利用Appicon and Launchimage Maker生成并配置iOSApp的图标和启动页
  9. 大同大学计算机与网络工程学院,计算机与网络工程学院代表队 在第十一届“蓝桥杯”全国软件和信息技术人才大赛全国决赛中再获佳绩...
  10. python接口自动化(二十)--token登录(详解)
  11. [网文摘录]云计算平台管理
  12. 几种常用 css3 选择器解释
  13. beego框架开发投票网站(1) beego基础之运行逻辑
  14. django uWSGI nginx搭建一个web服务器 确定可用
  15. Atitit 信息安全体系 资料书籍表 1. 《信息安全原理与技术 2 1.1. 第2章 工具箱: 鉴别、 访问控制与加密 2 1.2. 第3章 程序和编程 漏洞 木马 病毒 3 1.3. We
  16. oracle数据库日志关闭,oracle数据库关闭日志
  17. 游戏引擎——cocos2d-x
  18. 2021巢湖第一中学高考成绩查询,2021年巢湖高中学校排名及录取分数线排名
  19. 【Plant Biotech. J.】MdBBX22–miR858– MdMYB9/11/12模块调节苹果皮中原花青素的生物合成
  20. yoyo鹿鸣lumi动态壁纸人工桌面(软件篇)

热门文章

  1. 前端 用nginx解决js跨域问题
  2. VS+Qt应用开发,设置软件图标Icon
  3. vue实现雪花飘落特效
  4. unity3d控制物体移动
  5. CBQ的理解以及策略嵌套(待证实)
  6. sx1268芯片手册第13章翻译
  7. WIN7系统添加python的pip环境变量
  8. 三分钟了解常用的音频接口
  9. 集群介绍+用keepalived配置高可用集群(总结)
  10. ubuntn 服务器 可视化界面(安装可视化界面,浏览器直接访问)