作业要求

构建一个关系模式和课本中的关系movies(title,year,length,movietype,studioname,producerC)一样的关系,名称自定,在这个关系中插入1000万条记录。

注:关系movies的主键为(title,year)

要求如下:

  1. 在尽可能短的时间内完成;
  2. 只允许使用原生的SQL,不允许将SQL作为嵌入语言,也不允许使用其他语言如C#、Python等来完成;
  3. 提交你的详细解决方案和结果。

分析

查资料得知

  • 可以将多条insert语句合并为一句,即一条insert语句插入多个元组
  • 可以通过事务,减少每条insert语句都建立新事务带来的时空消耗
  • 可以通过load data infile将文件中的数据导入mysql,似乎很快的样子

虽然第三种似乎很快,但在此我采用了前两种方法,通过合并+事务实现。

我通过python模拟生成(只改变主键中的year,以生成不同元组)1千万条记录,将其组织为\(10\times100\times10000\)条记录添加进movies,分成10个事务,每个事务里有100条insert语句,每条insert语句插入10000个元组。

实现

实现思路如下:

  1. 复制原数据库moviedbnewmoviedb
  2. 设置max_allowed_packet,以保证一条insert语句可以插入足够多的元组
  3. 用python生成一条一次插入10000个元组的insert语句
  4. 用python生成一个包含100条insert语句的事务,保存至sql文件
  5. 用navicat运行该sql文件

至此就可以实现一百万条记录的插入了(我的电脑耗时327s?好像很慢!?)

之后再套一层循环就可以继续完成1千万条记录的插入了。

下面给出可能用到的步骤(如未说明,代码默认为控制行或者mysql环境下的命令):

复制数据库

创建新数据库newmoviedb

登录并创建数据库:

mysql -u root -p

CREATE DATABASE `newmoviedb` DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;

复制moviedb至newmoviedb

复制数据库

mysqldump moviedb -u root -pchouxianyu --add-drop-table | mysql newmoviedb -u root -pchouxianyu

上面chouxianyu是我的mysql密码

进入newmoviedb

use newmoviedb;

设置max_allowed_packet

设置max_allowed_packet为100M

set global max_allowed_packet = 100*1024*1024;

删除movies中所有元素(调试用)

delete from movies;

生成一条insert语句

下边是insert.py

insertStr = "INSERT INTO movies(title,year,length,movietype,studioname,producerC) VALUES"
value1_str = "('mymovietitle',"
# j
value2_str = ",120,'sciFic','MGM',100)"
# ,;
num_value = 10000 f = open(r'C:\Users\Cxy\Documents\Navicat\MySQL\Servers\MySQL\newmoviedb\insertRow.sql', 'w') # 清空文件内容再写 f.write(insertStr)
for j in range(1, num_value):
f.write(value1_str)
f.write(str(j))
f.write(value2_str)
f.write(',') f.write(value1_str)
f.write(str(num_value))
f.write(value2_str)
f.write(';') f.close()

生成一个事务

以下是transaction.py

transaction_begin_str = "START TRANSACTION;\n"
transaction_end_str = "COMMIT;\n" insertStr = "INSERT INTO movies(title,year,length,movietype,studioname,producerC) VALUES"
value1_str = "('mymovietitle',"
# j
value2_str = ",120,'sciFic','MGM',100)"
# ,;
num_value = 10000
num_sql = 100
# 打开文件
f = open(r'C:\Users\Cxy\Documents\Navicat\MySQL\Servers\MySQL\newmoviedb\transaction.sql', 'w') # 清空文件内容再写 # 将SQL语句写入文件
f.write(transaction_begin_str)
for i in range(1, num_sql+1):
f.write(insertStr)
for j in range(1, num_value):
f.write(value1_str)
f.write(str(i*num_value*10+j))
f.write(value2_str)
f.write(',') f.write(value1_str)
f.write(str(i*num_value*10+num_value))
f.write(value2_str)
f.write(';\n')
f.write(transaction_end_str) # 关闭文件
f.close()

参考链接

https://www.cnblogs.com/freefei/p/7679991.html

https://blog.csdn.net/qq_22855325/article/details/76087138

https://blog.csdn.net/weixin_44595372/article/details/88723191

https://zhidao.baidu.com/question/185665472.html

https://www.cnblogs.com/zhangjpn/p/6231662.html

https://www.cnblogs.com/wangcp-2014/p/8038683.html

https://blog.csdn.net/gb4215287/article/details/82669785


作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!


python+mysql:实现一千万条数据插入数据库的更多相关文章

  1. [MyBatis]五分钟向MySql数据库插入一千万条数据 批量插入 用时5分左右

    本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 我的数据库环境是mys ...

  2. LOAD DATA INFILE读取CSV中一千万条数据至mysql

    作业要求 构建一个关系模式和课本中的关系movies(title,year,length,movietype,studioname,producerC)一样的关系,名称自定,在这个关系中插入1000万 ...

  3. mysql自定义函数并在存储过程中调用,生成一千万条数据

    mysql 自定义函数,生成 n 个字符长度的随机字符串 -- sql function delimiter $$ create function rand_str(n int) returns VA ...

  4. java之5分钟插入千万条数据

    虽说不一定5分钟就插入完毕,因为取决去所插入的字段,如果字段过多会稍微慢点,但不至于太慢.10分钟内基本能看到结果. 之前我尝试用多线程来实现数据插入(百万条数据),半个多小时才二十多万条数据. 线程 ...

  5. orcle 如何快速插入百万千万条数据

    有时候做实验测试数据用到大量数据时可以用以下方法插入: 方法一:使用xmltable create table bqh8 as select rownum as id from xmltable('1 ...

  6. MySQL制作具有千万条测试数据的测试库

    有时候需要制造一些测试的数据,以mysql官方给的测试库为基础,插入十万,百万或者千万条数据.利用一些函数和存储过程来完成. 官方给的测试库地址:https://github.com/datachar ...

  7. 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负责的模块connector就派上了用场. ...

  8. mysql查询随机几条数据(速度快)

    MySql查询随机几条数据 想到了 Max RAND 这几个函数 用以下2种办法都可以实现查询. 速度还行. 几十万数据左右, 没有什么问题. SELECT * FROM `news` WHERE i ...

  9. 腾讯面试题,js处理1千万条数据排序并且页面不卡顿

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)

    一.什么是firewalld防火墙? firewalld防火墙在Linux主机里其实就是一道隔离工具,它只对进出主机的请求做判断处理.也就是说它只管进出,至于你进来后做了什么,就不在firewalld ...

  2. 到处抄来的SUCTF2019 web wp

    0x01 EasySQL 这是一个考察堆叠注入的题目,但是这道题因为作者的过滤不够完全所以存在非预期解 非预期解 直接构造 *,1 这样构造,最后拼接的查询语句就变成了 select *,1||fla ...

  3. eNSP——配置全局地址池的DHCP

    原理: 拓扑图: 实验编址: 1.基本配置 2.配置全局地址池的DHCP Server 在R1上开启DHCP功能,使用ip pool命令创建一个全局地址池,名字自己定. 在全局地址池配置网段.掩码.租 ...

  4. socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket

    client与server建立socket连接之后,如果突然关闭server,此时,如果不在客户端close(socket_fd),会有不好的影响: QsocketNotifier监控socket的槽 ...

  5. Vue.js与React的全面对比

    Vue与React的对比 Vue.js与React.js从某些反面来说很相似,通过两个框架的学习,有时候对一些用法会有一点思考,为加深学习的思索,特翻阅了两个文档,从以下各方面进行了对比,加深了对这两 ...

  6. Sql server 中count() 与 sum() 的区别

    一句话概括就是Sum(列) 是求和,把所有列的值进行汇总求和:COUNT(列) 是行数汇总,只要列的值不为Null,就会增加1: 举个例子说明下: --创建临时表结构 CREATE TABLE Tem ...

  7. (九)Javabean与Jsp(来自那些年的笔记)

    目录 JavaBean 在JSP中使用JavaBean 标签用法 带标签体的 JavaBean 标签 setProperty 标签 getProperty 标签 JSP开发模式 案列:使用 模式一 编 ...

  8. BinaryTree(HDU-5573)【思维/构造】

    题目链接:https://vjudge.net/problem/HDU-5573 题意:一棵二叉树,编号代表对应节点的取值,可以走k步,每次走的层数递增,问能够达到N的方案. 思路:首先看一下数据范围 ...

  9. ubuntu内lnmp相关操作命令

    LNMP状态管理命令: **LNMP状态管理:** sudo lnmp {start|stop|reload|restart|kill|status} **Nginx状态管理:**sudo /etc/ ...

  10. linux下添加用户并将文件夹授权给某一个用户

    ### linux下添加用户并将文件夹授权给某一个用户 背景:在做一个项目时,需要外包的前端人员调试测试环境的页面,但是又不能给他服务器的账号信息,就在服务器上新添加一个子账户,再给这个账户项目文件的 ...