范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  如果你打算好好学习一下 MySQL,性能优化肯定是绕不过去一个问题。当你撸起袖子准备开始的时候,突然发现一个问题摆在眼前,本地数据库中没那么大的数据量啊,几条数据优化个毛线啊。生产库里数据多,但谁敢直接在生产环境动手啊,想被提前优化吗?
  要知道,程序员从不轻言放弃,没有数据我们就自己创造数据嘛,new 对象这种事情可是我们的拿手好戏,对象都能 new 出来,更别说几百万条数据了。使用官方数据
  官方显然知道我们需要一些测试数据做个练习什么的,所以准备了一份测试数据给我们。可以到 https://github.com/datacharmer/test_db 上去下载,这个数据库包含约30万条员工记录和280万个薪水条目,文件大小为 167 M。
  下载完成之后,直接使用 MySQL 客户端运行 sql 文件即可。
  或者直接使用命令,然后输入密码导入。mysql -u root -p < employees.sql
  这是最简单的一种方法,只要你能把 sql 文件下载下来就可以了。但是数据量不够大,员工表才 30 万条数据,还不够百万级别,而且字段都是定义好的,不能灵活定制。背景说明
  创建百万级数据的方式,要到达的目的有两点:定制比较灵活,不能只是一两个字段了事,那没什么实际意义。速度快,不能说弄个几百万数据好几个小时甚至更长,那不能接收。
  本次目标是创建两个表,一个用户表,另外一个订单表,当然没有真实环境中的表字段那么多,但是对于学习测试来说差不多够了。
  两个表的表结构如下:# 用户表 CREATE TABLE `user` (   `id` varchar(36) NOT NULL,   `user_name` varchar(12) DEFAULT NULL,   `age` tinyint(3) DEFAULT NULL,   `phone` varchar(11) DEFAULT NULL,   `province` varchar(10) DEFAULT NULL,   `city` varchar(10) DEFAULT NULL,   `create_time` datetime DEFAULT NULL,   `update_time` datetime DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 订单表 复制代码CREATE TABLE order ( id varchar(36) NOT NULL, user_id varchar(36) DEFAULT NULL, product_count int(11) DEFAULT NULL, price decimal(10,0) DEFAULT NULL, create_time datetime DEFAULT NULL, update_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  用户表(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 支持一次性插入多条记录,就是下面这样的形式。insert into `table_name` (id,column1) values (1,"value1"),(2,"value2"),(3,"value3");
  这样一来,比你一条一条语句执行要快很多,比如 1000 条记录执行一次 insert,一共执行 5000 次即可,如果是一条一条插入呢,那就要执行 500 万次。
  由于后面两种方式用到了 Python 生成文件,所以这种方式也用了 Python 实现,实例代码如下。完整代码可在文末给出的 github 上获取。def insert_data(self):   cursor = self.conn.cursor()   for x in range(5000):     insert_user_sql = """             insert into `user` ( `id`,`user_name`,`phone`,`age`, `province`, `city`, `create_time`,`update_time` )                     VALUES(%s,%s,%s,%s,%s,%s,%s,%s)                 """     insert_order_sql = """ insert into `order` ( `id`, `product_count`, `user_id`, `price`, `create_time`, `update_time`)                                 values(%s,%s,%s,%s,%s,%s)                                """     user_values, order_values = [], []     for i in range(1000):       timestamp = self.randomTimestamp()       time_local = time.localtime(timestamp)       createTime = time.strftime("%Y-%m-%d %H:%M:%S", time_local)       user_id = str(uuid.uuid4())       user_values.append(         (user_id, "名字" + str(x) + str(i), self.createPhone(), random.randint(1, 120),          str(random.randint(1, 26)),          str(random.randint(1, 1000)), createTime, createTime))        random_order_count = random.randint(0, 3)       if random_order_count > 0:         for c in range(random_order_count):           timestamp = self.randomTimestamp()           time_local = time.localtime(timestamp)           order_create_time = time.strftime("%Y-%m-%d %H:%M:%S", time_local)           order_values.append((str(uuid.uuid4()), random.randint(1, 5), user_id,                                random.randint(10, 2000), order_create_time, order_create_time))           cursor.executemany(insert_user_sql, user_values)           cursor.executemany(insert_order_sql, order_values)           self.conn.commit()            cursor.close()
  经过一段时间时间的等待后,运行完成了,整个运行过程耗时 1823 秒,30分钟。
  最后成功生成用户记录 500 万条,订单记录 749 万多条。
  速度还算能接受吧,马马虎虎吧。
  再想速度快一点,可以开多线程,我用 5 个线程跑了一下,一个线程插入 100万条,最终最长的线程耗时 1294秒,21分钟,也没快多少,线程个数对时间多少有些影响,但是我没有试。
  生成 SQL 脚本
  这种方式和上面的方式类似,只不过上面通过程序方式直接将拼接出来的 SQL 语句执行了,而这种方式是将拼接好的 SQL 语句写入文件中。当然还是以一条语句插入多行记录的形式。insert into `table_name` (id,column1) values (1,"value1"),(2,"value2"),(3,"value3");
  写 500 万用户数据,加上随机的订单数据, sql 文件的过程耗时为 696 秒,11分钟左右。
  当然这么大数据量拼接出来的脚本文件也很大,用户表脚本 680 多M,订单表脚本 1个G。
  最后将写好的这两个文件分别在 MySQL 中执行。
  执行用户表脚本,耗时 3 分钟左右。mysql -uroot -p mast_slave < sql/insert_user_500w.sql
  执行订单表脚本,耗时 7 分钟左右,订单量 750 多万个。mysql -uroot -p mast_slave < sql/insert_order_500w+.sql
  一共耗时,20分钟左右,加上中间的手工操作,感觉不如第一种方法中的多线程方式省事。load data infile 方式
  最后这种方式是使用 load data infile 方式,这是 MySQL 提供的一种从文件快速导入的方式。比如按照特定符号分隔,导入对应的字段中。
  本文例子中我是按照逗号分隔的,字段之间以逗号分隔,生成 500 万条用户行 和随机订单行。
  依然是用 Python 脚本生成文件,生成文件的过程耗时 779 秒,12分钟左右。
  两个文件大小分别是 560 多M 和 900 M。
  最后执行 load data infile 将文件导入到对应的表中,在执行这个命令后可能会出现下面这个错误提示。
  ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
  这是因为 MySQL 自身的安全配置所致,需要更改 my.cnf,在其中加入下面的配置,然后重启服务。secure_file_priv=
  等于号后边为空表示允许所有目录下的文件 load,如果要限定某个特定目录,在等于号后边填上对应的文件目录即可。
  然后执行下面的语句,将用户记录导入到 user 表。load data infile "/Users/fengzheng/知识管理/技术写作/mysql/创建测试数据/sql/load_user_txt_500w.txt" replace into table user FIELDS TERMINATED BY ",";
  500万条耗时 3分32秒。
  将订单记录导入到 order 表。load data infile "/Users/fengzheng/知识管理/技术写作/mysql/创建测试数据/sql/load_order_txt_500w+.txt" replace into table `order` FIELDS TERMINATED BY ",";
  749 万条记录,耗时 8分31秒。
  整个过程加起来 24 分钟左右。最后
  好了,现在可以愉快的做各种测试和优化了。
  有同学看完可能要说了,20多分钟好像也不算快啊。因为数据量确实比较大,再有数据复杂度和导入时间也有很大关系,如果你只是导入一列自增id,别说 500 万,1000万都用不了一分钟就完成了。
  其实还有一点优化空间的,比如说把数据库引擎改成 MYISAM 会更快一些,尤其是对于批量插入的情景,但是插入完成后还要再改回来,也需要耗费一些时间,而且来回切换也比较麻烦。
  上面的几种方法都配合了 Python 脚本,当然你可以换成自己熟悉的语言,比如 Java,或者直接写 bash 脚本也可以。
  作者:古时的风筝
  链接:https://juejin.im/post/6858042078221074445

爆款手机频出!OPPO国内销量连续两月占首位,产品线布局优势凸显在当今智能手机市场,竞争可以说是越来越激烈,各大手机厂商为了争取更高的销量,都各自寻找不同的突破口,通过差异化的产品抢占市场,因此每一个月份的销量往往都会是你追我赶的态势。而根据数幕后黑手终被爆出,暂停俄罗斯支付功能,一口气解约34家中企苹果这是在玩火自焚啊,它不仅暂停了在俄罗斯的支付地图和其他功能,而且无视央视的多次指责,一口气提交了34家中国企业。不过这一次,算是踢到了铁板上,俄罗斯首先杀了一把回马枪。总统普京京东裁员变毕业,裁员也需要高情商?顶端新闻河南商报记者杨琨近日,京东深陷裁员风波。3月28日,京东公开对媒体回应,此轮裁员只是业务板块的正常优化,京东主体业务依然健康发展。虽然大面积裁员事件闹了个乌龙,但是网上流传刚上市就降价700元!iPhoneSE3开始收割市场,果粉们有福了苹果在今年的春季发布会上推出了一系列新品,包括仓岭绿配色的iPhone13iPhone13ProiPadAir5以及MacStudio等,其中最被消费者们关注的当属全新的iPhon中国剃须刀巨头崛起打败松下飞利浦,终成中国剃须刀之王作为一名男士,让自己有一个干净清爽的个人形象是非常重要的,尤其是在职场中。如果一直都是胡子拉碴的,给别人的第一印象就不好,不利于自己工作的开展,与人交际也是非常不礼貌的。中国男神神新一代骁龙8Plus五月初推出,台积电包揽业务简讯高通的骁龙8Gen1Plus的下一代旗舰,将在五月初推出(型号SM8475),比以前的版本要早得多。高通公司计划将其最大的SoC业务交给台积电,骁龙8Gen1Plus将会使用台金融科技提亮首批上市银行2021年年报4家银行金融科技投入同比呈双位数增长本报记者张志伟见习记者张博上市银行2021年年报披露已拉开帷幕。截至目前,包括交通银行平安银行招商银行等在内的8家上市银行已先后披露2021年年报。记者注意到,2021年,这些银行手机已成为当今社会的精神鸦片!比大清朝还要严重很多很多手机来到这个社会其实也没有多长时间!在很多年以前都是只有固定电话,简称固话。从上个世纪九十年代开始起,最早的手机就是大哥大!价格贵的离谱最早要两万多元一部,那时候的两万多元差不多可市值蒸发近3。8万亿,阿里回到原点,马云彻底告别中国首富宝座阿里作为中国最大的互联网公司,无疑是神话般的存在,然而如今也走下坡路了。在过去的20年里,互联网发生了翻天覆地的变化,其中阿里开启了中国电子商务零售新时代。最重要的是使中国人的购物碳中和产业报告之新能源发展现状及未来趋势上篇文章里讲述了什么是碳中和碳中和对于中国发展的意义以及实现碳中和的发展路径,感兴趣的朋友可以从我的文章中了解,而今天主要讲述的是新能源发展的现状以及未来发展趋势,而解决发展过程中集成物联网技术以实现有效的环境监测随着城市化进程的加快,环境问题已成为组织必须解决的重要问题。物联网技术被证明可以非常有效地缓解与环境相关的问题。物联网是一个庞大的主题,涉及更好地利用资源基于传感器的功能和战略来提
9月国内汽车质量投诉指数分析报告投诉总结发现一,从投诉品牌来看,长安吉利本田位居前三位。锐程CC长安UNIT遭到集中投诉的车机系统卡顿系统升级问题和长安UNIT的变速箱顿挫问题,是长安位居榜首的罪魁祸首。前十大品想玩一些大型的游戏,显卡预算只有500元应该购买什么样的显卡导读前一段时间忙着搬家,今天才有时间去更新文章,我发现关注我的粉丝都是铁粉,这都失踪多长时间了,粉丝数量依旧在增长,没有往下掉,实在是感谢依旧关注老程的小伙伴。今天就给大家推荐一些高端主机性价比之王AMD5600X处理器导读前两天因为10600KF和AMD5600X两个处理器搭配的配置,老程专门写了一篇关于这两个产品的性价比,10600KF的性价比在于intel平台,AMD5600X的性价比在于整前三季度上汽名爵投诉分析,机械问题频发还减配?尽管上汽一直宣传着名爵的百年品牌以及运动气息,但近两年来的销量大不如从前,18月份销量仅有19万辆,不禁让人唏嘘。那如今的上汽名爵是怎样逐渐出现颓势,我们参考着汽车门网车主们投诉数极氪001下线了但极氪要走的路还很长10月19日,极氪001正式下线。成立仅7个月后,极氪汽车就迎来了交付。这个由吉利董事长李书福亲自挂帅吉利CEO安聪慧全权负责的吉利高端新能源品牌步子迈的相当快。成立仅23天后,极A级价格B级享受试驾小雅阁新凌派在国内竞争最为激烈的紧凑车市场永远不缺明星车型,这里有长期霸榜的英朗轩逸朗逸,也有被奉为神车的思域。或许正是因为车型太多让很多实力出众的车型都隐没在车海之中,广汽本田凌派就是其中之打破规则奔腾B702。0T展现了一汽迈高求变的决心10月29日,一汽奔腾B702。0T车型正式上市。当人们议论,一汽奔腾在518战略下将以怎样的姿态进发之时,奔腾B702。0T车型给出了回应拔高产品定位,增强竞争力。时下,小排量发奔驰力挺普信男创始人杨笠车主像吃了苍蝇近来,自媒体和综艺节目的火热造就了一些颇具流量的网红。可能正是因为这些流量,车企们也开始通过网红来宣传品牌。但从日前的消息来看,这种宣传方式的成效似乎有些不尽人意,甚至还起到了反效刚交付就被55名车主联名维权极氪为何频繁翻车?如果在以前提起车主联合声明的字眼,相信大家都会第一时间想到惨遭黑天鹅事件的蔚来汽车。但就在前天,极氪001的数十名车主也被迫发起了联合声明,并且还做出了一张颇具设计感的车主发声海报10月车企投诉指数排行续航不足成新痛点2021年10月车企投诉指数显示,因长安UNIT投诉回撤长安汽车投诉指数大幅下滑,吉利汽车重回首位,博越帝豪帝豪L等多款车型遭遇集中投诉,变速箱顿挫异响车身生锈车机无法升级成为投诉前三季度紧凑型轿车投诉榜两车又被质疑黑心棉最近,汽车门网前三个季度的汽车投诉数据已经统计出来。前三季度紧凑型轿车整体投诉呈下降趋势,考虑到今年芯片短缺所导致的新车涨价缺货,所以新车投诉相比往年减少很多。接下来我们就来盘点一