游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

快速创建MySQL五百万级数据,愉快的学习各种优化技巧

  如果你打算好好学习一下MySQL,性能优化肯定是绕不过去一个问题。当你撸起袖子准备开始的时候,突然发现一个问题摆在眼前,本地数据库中没那么大的数据量啊,几条数据优化个毛线啊。生产库里数据多,但谁敢直接在生产环境动手啊,想被提前优化吗?
  要知道,程序员从不轻言放弃,没有数据我们就自己创造数据嘛,new对象这种事情可是我们的拿手好戏,对象都能new出来,更别说几百万条数据了。使用官方数据
  官方显然知道我们需要一些测试数据做个练习什么的,所以准备了一份测试数据给我们。可以到https:github。comdatacharmertestdb上去下载,这个数据库包含约30万条员工记录和280万个薪水条目,文件大小为167M。
  下载完成之后,直接使用MySQL客户端运行sql文件即可。
  或者直接使用命令,然后输入密码导入。mysqlurootpemployees。sql
  这是最简单的一种方法,只要你能把sql文件下载下来就可以了。但是数据量不够大,员工表才30万条数据,还不够百万级别,而且字段都是定义好的,不能灵活定制。背景说明
  创建百万级数据的方式,要到达的目的有两点:定制比较灵活,不能只是一两个字段了事,那没什么实际意义。速度快,不能说弄个几百万数据好几个小时甚至更长,那不能接收。
  本次目标是创建两个表,一个用户表,另外一个订单表,当然没有真实环境中的表字段那么多,但是对于学习测试来说差不多够了。
  两个表的表结构如下:用户表CREATETABLEuser(idvarchar(36)NOTNULL,usernamevarchar(12)DEFAULTNULL,agetinyint(3)DEFAULTNULL,phonevarchar(11)DEFAULTNULL,provincevarchar(10)DEFAULTNULL,cityvarchar(10)DEFAULTNULL,createtimedatetimeDEFAULTNULL,updatetimedatetimeDEFAULTNULL,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8mb4;订单表复制代码CREATETABLEorder(idvarchar(36)NOTNULL,useridvarchar(36)DEFAULTNULL,productcountint(11)DEFAULTNULL,pricedecimal(10,0)DEFAULTNULL,createtimedatetimeDEFAULTNULL,updatetimedatetimeDEFAULTNULL,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8mb4
  用户表(user)创建500万条数据,id使用uuid,年龄从1到120随机,电话号码随机11位,省份编码和城市编码随机,创建时间和更新时间在某一时间范围内随机。
  订单表(order)根据用户表生成,每个用户随机生成0到3个订单,订单编号采用uuid,商品数量随机1到5个,价格随机,创建时间和更新时间在某一时间段内随机。由于每个用户产生0到3个订单,所以,产生的订单量应该大于500万,我在本地跑的时候基本上在700多万左右。
  创建总时间和表的字段个数以及字段的生成算法有直接关系,字段越多、算法越复杂,需要的时间就越多,比如使用uuid就比使用自增id花费更长时间,随机时间就比直接使用当前时间花费更长时间。
  如果只插入500万自增id这一个字段,十几秒就能完成,但是无论是模拟线上环境还是自学性能优化技巧都没什么意义。
  下面就来介绍三种方式来快速创建500万用户数据以及大于500万的订单数据。写程序批量插入
  作为一个开发人员,当你打算创建百万条数据的时候,大多数时候首先相当的应该就是写程序,毕竟CURD我们最拿手了。
  用程序的方式插入也分两种情况,第一种就是逐条插入,这也是平时开发中最常用到的方法,直觉上我们可能会认为这样比较快。事实上并不是这样,虽然比起手动一条一条插入是快的多,但是,很有可能你在等待了一段时间后失去耐心,然后结束程序,不管你用哪种数据库连接池都一样,在百万数量级面前仍然慢的离谱。
  第二种情况就是使用MySQL的批量插入方法,我们都知道MySQL支持一次性插入多条记录,就是下面这样的形式。insertintotablename(id,column1)values(1,value1),(2,value2),(3,value3);
  这样一来,比你一条一条语句执行要快很多,比如1000条记录执行一次insert,一共执行5000次即可,如果是一条一条插入呢,那就要执行500万次。
  由于后面两种方式用到了Python生成文件,所以这种方式也用了Python实现,实例代码如下。完整代码可在文末给出的github上获取。definsertdata(self):cursorself。conn。cursor()forxinrange(5000):insertusersqlinsertintouser(id,username,phone,age,province,city,createtime,updatetime)VALUES(s,s,s,s,s,s,s,s)insertordersqlinsertintoorder(id,productcount,userid,price,createtime,updatetime)values(s,s,s,s,s,s)uservalues,ordervalues〔〕,〔〕foriinrange(1000):timestampself。randomTimestamp()timelocaltime。localtime(timestamp)createTimetime。strftime(YmdH:M:S,timelocal)useridstr(uuid。uuid4())uservalues。append((userid,名字str(x)str(i),self。createPhone(),random。randint(1,120),str(random。randint(1,26)),str(random。randint(1,1000)),createTime,createTime))randomordercountrandom。randint(0,3)ifrandomordercount0:forcinrange(randomordercount):timestampself。randomTimestamp()timelocaltime。localtime(timestamp)ordercreatetimetime。strftime(YmdH:M:S,timelocal)ordervalues。append((str(uuid。uuid4()),random。randint(1,5),userid,random。randint(10,2000),ordercreatetime,ordercreatetime))cursor。executemany(insertusersql,uservalues)cursor。executemany(insertordersql,ordervalues)self。conn。commit()cursor。close()
  经过一段时间时间的等待后,运行完成了,整个运行过程耗时1823秒,30分钟。
  最后成功生成用户记录500万条,订单记录749万多条。
  速度还算能接受吧,马马虎虎吧。
  再想速度快一点,可以开多线程,我用5个线程跑了一下,一个线程插入100万条,最终最长的线程耗时1294秒,21分钟,也没快多少,线程个数对时间多少有些影响,但是我没有试。
  生成SQL脚本
  这种方式和上面的方式类似,只不过上面通过程序方式直接将拼接出来的SQL语句执行了,而这种方式是将拼接好的SQL语句写入文件中。当然还是以一条语句插入多行记录的形式。insertintotablename(id,column1)values(1,value1),(2,value2),(3,value3);
  写500万用户数据,加上随机的订单数据,sql文件的过程耗时为696秒,11分钟左右。
  当然这么大数据量拼接出来的脚本文件也很大,用户表脚本680多M,订单表脚本1个G。
  最后将写好的这两个文件分别在MySQL中执行。
  执行用户表脚本,耗时3分钟左右。mysqlurootpmastslavesqlinsertuser500w。sql
  执行订单表脚本,耗时7分钟左右,订单量750多万个。mysqlurootpmastslavesqlinsertorder500w。sql
  一共耗时,20分钟左右,加上中间的手工操作,感觉不如第一种方法中的多线程方式省事。loaddatainfile方式
  最后这种方式是使用loaddatainfile方式,这是MySQL提供的一种从文件快速导入的方式。比如按照特定符号分隔,导入对应的字段中。
  本文例子中我是按照逗号分隔的,字段之间以逗号分隔,生成500万条用户行和随机订单行。
  依然是用Python脚本生成文件,生成文件的过程耗时779秒,12分钟左右。
  两个文件大小分别是560多M和900M。
  最后执行loaddatainfile将文件导入到对应的表中,在执行这个命令后可能会出现下面这个错误提示。
  ERROR1290(HY000):TheMySQLserverisrunningwiththesecurefileprivoptionsoitcannotexecutethisstatement
  这是因为MySQL自身的安全配置所致,需要更改my。cnf,在其中加入下面的配置,然后重启服务。securefilepriv
  等于号后边为空表示允许所有目录下的文件load,如果要限定某个特定目录,在等于号后边填上对应的文件目录即可。
  然后执行下面的语句,将用户记录导入到user表。loaddatainfileUsersfengzheng知识管理技术写作mysql创建测试数据sqlloadusertxt500w。txtreplaceintotableuserFIELDSTERMINATEDBY,;
  500万条耗时3分32秒。
  将订单记录导入到order表。loaddatainfileUsersfengzheng知识管理技术写作mysql创建测试数据sqlloadordertxt500w。txtreplaceintotableorderFIELDSTERMINATEDBY,;
  749万条记录,耗时8分31秒。
  整个过程加起来24分钟左右。最后
  好了,现在可以愉快的做各种测试和优化了。
  有同学看完可能要说了,20多分钟好像也不算快啊。因为数据量确实比较大,再有数据复杂度和导入时间也有很大关系,如果你只是导入一列自增id,别说500万,1000万都用不了一分钟就完成了。
  其实还有一点优化空间的,比如说把数据库引擎改成MYISAM会更快一些,尤其是对于批量插入的情景,但是插入完成后还要再改回来,也需要耗费一些时间,而且来回切换也比较麻烦。
  上面的几种方法都配合了Python脚本,当然你可以换成自己熟悉的语言,比如Java,或者直接写bash脚本也可以。
  作者:古时的风筝
  链接:https:juejin。impost6858042078221074445

报告揭露智慧城市技术差距世界经济论坛发现,在G20全球智慧城市联盟的36个先锋城市中,几乎所有城市都存在与智慧城市技术相关的政策差距。接受调查的城市跨越22个国家,包括加拿大的多伦多、印度的班加……小米首款仿生四足机器人惊艳亮相,代码撸狗已成现实原子同学2021年8月10日,小米举办了以《我的梦想,我的选择》为主题的2021年度演讲暨发布会,作为彩蛋公布的仿生四足机器人CyberDog工程探索版,彻底将整场新品发布会引向高潮。……游戏手机这下难受了!卢伟冰搅局给你一个无法拒绝的价格游戏爱好者们来说说,当下游戏手机最大的槽点是什么?我觉得是它根本无法当一台正常手机用,首先市面上游戏手机厚度都在10mm左右,重量接近半斤,这样的砖头机携带很不方便;其次游戏手……秦岭光头山,上次在这看到绝美日出,这次被人赶下山我不知道还有多少人记得我之前写过一篇去光秃山看日出的文章《凌晨4点爬山,看陕西绝美云海日出!还有雾凇景观,犹如仙境》,很幸运的是,这篇文章也得到了青云计划奖励。这让我充分……数据仓库的一些概念数据仓库的一些概念前言由于工作原因,接触到了数据仓库,在平时工作交流的时候可能涉及到一些概念需要补课。因此这里准备补补课。啥是数据仓库数据仓库,英文名称为DataW……千元机又怎么样?3个理由告诉你,千元机也很值得不知道看文章的你是什么想法,现在我身边的朋友都不太会频繁地更换手机。今年来就三个朋友换了新手机,让人意想不到的是他们不约而同的都选择了更便宜的千元机。或许是因为他对手机没……蛋壳租金贷可以2023年再还,微众银行真好人呀最近蛋壳搞得世界很混乱。世界原本单纯,一个房东一个租客,一手交房给住一手交钱给租。加了个蛋壳,蛋壳碎了之后,房东想解约收房得租客先解约,而租客交了钱还没住就没法解约……中信被立案,多家银行被罚,但数据最惊悚的还在现金贷今天下午,传来了中信银行被立案的消息。不过不是公安立的,是银保监。这事因池子而起,但查到最后似乎已经与池子无关了,这事对池子是偶发,对中信银行是常事,因为数据泄露,中信已……我们都误解爱因斯坦了,爱因斯坦直到晚年亦从未信神爱因斯坦曾经旗帜鲜明地表明:所有宗教都是典型的原始迷信圣经场景上帝这个词在我看来只不过是人类弱点的体现和产物,《圣经》中那些可敬的故事也只不过是原始的传说罢了。无论……80岁严氏终生名誉会长修网谱是科技时代的必然趋势严老前辈协助支系采集基础资料为什么现在流行修互联网家谱?湖北咸丰的80岁水利退休职工严峻严老前辈,说出了自己的看法。修网谱是科技时代的必然趋势!我们经过一段时间体验……长安新能源Star国民版多彩款新年伊始油价迎来四连涨,新能源赋予大希望,奔奔EStar国民版多彩款来啦新年开始,受到国际外部环境影响,原油价格一路飙升至95美元,致使国内油价在短短一个月内,连续4次上……AppleWatchSeries7苹果手表7预定时间公布10月4日晚,苹果官方正式公布了AppleWatchSeries7系列的开售时间。AppleWatchSeries7将于10月8日(周五)起接受订购,并将于10月15日(周五)……
vivoTWSNeo体验只有音质还不够,稳定与低延迟才是它的苹果用AirPods取代了过去的耳机孔,当时看这种激进的设计还是不太理解,而如今,iPhone的无线化已经得到了很好的反馈。再看国内手机厂商,它们也陆续推出了自家的TWS真无线……在同样的咖啡馆邂逅vivoTWS2,一切都更美好了应该是从前两年开始不,或许是更早吧,蓝牙耳机就替代了有线耳机,成为当下的一种潮流。作为前iPhone用户,我的AirPods是第一时间入手的,不可否认,它是TWS的开拓者,但在……施密特彻底告别Google一代功臣将辞去最后的职务据CNET援引未具名消息人士称,Google前CEO埃里克施密特(EricSchmidt)不再担任公司顾问。据报道,施密特已经在2月就停止担任技术顾问。有评论认为施密特的……比亚迪汽车6月销量出炉全系销49765辆,秦PLUSDMi月进入2021年7月份,车市半年盘点工作也开始启动。日前,我们通过比亚迪官方发布的最新产销快报消息了解到:比亚迪乘用车在2021年6月全系销售新车近5万辆大关,达到了49765辆……手机不要因为产品优秀而买,而要因为自身需求去买【以最合适的价格买到最满意的产品。】合适,指自己可以接受,满意,指符合自己需求。从理性角度去看,以最少的钱买到符合自己需求的产品就好,而这个需求,如果再从理性的角度细分手……iPhone的好搭档,随身数码的补给站,闪焰狐无线充电宝分享前些年,我出门必带的还是手机、钱包、钥匙三大件,然而时代飞速发展,如今钱包早已不是随身必备之物,家里装了智能门锁的话,钥匙也可以不带,唯独对手机的依赖性持续提升,感觉如果再进化……立体库堆垛机主体结构堆垛起重机也称堆垛机,是立体仓库中最重要的起重运输设备,是代表立体仓库特征的标志。它的主要作用是在立体仓库的通道内来回运行,将位于巷道口的货物存入货架的货格,或者取出货格内的货……IQOO8将于8月17日发布,各种旗舰配置即将亮相,这是一款近日,IQOO正式官宣将于8月17日晚7:30举行新品发布会,届时将推出新一代的旗舰机器IQOO8系列手机,本次的口号为全感操控,一触即发!。根据此前的消息,IQOO8系……华为MateX2畅连APP有多香?全新的分享方式你会吗?2月22日晚间,华为新一代折叠旗舰手机MateX2正式发布,从设计到适配都达到了全新高度,刷新了我们对折叠屏手机的期待。搭载MateX2拖拽分享、多应用分屏、悬浮窗口等功能,畅……去了华为线下体验店,找到了华为P50火爆的原因来到金九银十季,华为的新品也是一茬接一茬。而就像员工入职需要考察期,我们入手新产品也要经过考察。所以每逢上新,我都会去华为线下体验店逛一圈,试试新品,还能蹭上一波最全华为全家桶……30年卖出20亿台家电,想撼动苏宁易购的家电霸主地位?难今年上半年,因为疫情,各行各业都过的比较难,家电行业也不可避免地受到影响。然而消费者购买家电的需求只会延迟,不会消失。随着形势的好转,家电的销售也将触底反弹,810苏宁家电日全……三问MiniMicroLED芯片厂产能技术未来规划作为LED产品的关键组成部分,LED芯片的主要功能是将电能转化为光能,其优劣直接影响着LED终端产品的质量和性能。在需求方面,据TrendForce集邦咨询旗下光电研究处……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网