mysql中使用存储过程生成1亿条数据

参考 mysql存储过程-菜鸟教程
参考 mysql利用存储过程批量插入一千万数据(半小时)

最近准备深入学习下mysql索引及事务相关知识,数据量太小的话sql效率反馈不是很直观,先记录下第一批数据,后面根据需要再更新更多其他类型的字段。

2020-10-13 23:29 追更
由于我的ubuntu系统根目录只有不到10G可用,生成1亿条数据直接把根目录塞爆了,都没法正常登 录系统了,只能重启进命令行模式删掉刚刚生成的表数据,然后把默认的mysql表数据存储位置改到其他位置。

  1. 关闭mysql服务,将原mysql数据复制到新目录,并更改目录权限

    sudo service mysql stop
    sudo mkdir -p /home/luoluo/mysql
    sudo cp -R /var/lib/mysql/* /home/luoluo/mysql
    sudo chown -R mysql:mysql /home/luoluo/mysql
  2. 更改mysql配置文件 datadir值

    sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
    datadir=/home/luoluo/mysql
  3. 修改启动文件

    sudo vim /etc/apparmor.d/usr.sbin.mysqld
    /var/lib/mysql r
    /var/lib/mysql/** rwk 
    修改成
    /home/luoluo/mysql r 
    /home/luoluo/mysql/** rwk
  4. 重启服务

    sudo service apparmor restart
    sudo service mysql start

存储过程脚本

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_100million_data`( )
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE uid char(10) DEFAULT '';
    DECLARE count decimal(6,2) DEFAULT 0;
    DECLARE name VARCHAR(255) DEFAULT '';
    DECLARE content text;
    DECLARE image varchar(255) default '';
    DECLARE age INT DEFAULT 0;
    declare status tinyint(1) default 0;

    DECLARE xing varchar(2056) DEFAULT '赵钱孙李周郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闽席季麻强贾路娄危江童颜郭梅盛林刁锺徐丘骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁';
    DECLARE ming varchar(2056) DEFAULT '嘉懿煜城懿轩烨伟苑博伟泽熠彤鸿煊博涛烨霖烨华煜祺智宸正豪昊然明杰诚立轩立辉峻熙弘文熠彤鸿煊烨霖哲瀚鑫鹏致远俊驰雨泽烨磊晟睿天佑文昊修洁黎昕远航旭尧鸿涛伟祺轩越泽浩宇瑾瑜皓轩擎苍擎宇志泽睿渊楷瑞轩弘文哲瀚雨泽鑫磊梦琪忆之桃慕青问兰尔岚元香初夏沛菡傲珊曼文乐菱痴珊恨玉惜文香寒新柔语蓉海安夜蓉涵柏水桃醉蓝春儿语琴从彤傲晴语兰又菱碧彤元霜怜梦紫寒妙彤曼易南莲紫翠雨寒易烟如萱若南寻真晓亦向珊慕灵以蕊寻雁映易雪柳孤岚笑霜海云凝天沛珊寒云冰旋宛儿绿真盼儿晓霜碧凡夏菡曼香若烟半梦雅绿冰蓝灵槐平安书翠翠风香巧代云梦曼幼翠友巧听寒梦柏醉易访旋亦玉凌萱访卉怀亦笑蓝春翠靖柏夜蕾冰夏梦松书雪乐枫念薇靖雁寻春恨山从寒忆香觅波静曼凡旋以亦念露芷蕾千兰新波代真新蕾雁玉冷卉紫山千琴恨天傲芙盼山怀蝶冰兰山柏翠萱乐丹翠柔谷山之瑶冰露尔珍谷雪乐萱涵菡海莲傲蕾青槐冬儿易梦惜雪宛海之柔夏青亦瑶妙菡春竹修杰伟诚建辉晋鹏天磊绍辉泽洋明轩健柏煊昊强伟宸博超君浩子骞明辉鹏涛炎彬鹤轩越彬风华靖琪明诚高格光华国源宇晗昱涵润翰飞翰海昊乾浩博和安弘博鸿朗华奥华灿嘉慕坚秉建明金鑫锦程瑾瑜鹏经赋景同靖琪君昊俊明季同开济凯安康成乐语力勤良哲理群茂彦敏博明达朋义彭泽鹏举濮存溥心璞瑜浦泽奇邃祥荣轩';
    DECLARE l_xing int DEFAULT LENGTH(xing) / 3; # 这里的长度不是字符串的字数,而是此字符串的占的容量大小,一个汉字占3个字节
    DECLARE l_ming int DEFAULT LENGTH(ming) / 3;
    DECLARE final_xing VARCHAR(255) DEFAULT '';
    DECLARE final_ming VARCHAR(255) DEFAULT '';
    DECLARE texts varchar(2056) default '盖闻明主图危以制变,忠臣虑难以立权。是以有非常之人,然后有非常之事;有非常之事,然后立非常之功。夫非常者,固非常人所拟也。曩者,强秦弱主,赵高执柄,专制朝权,威福由己;时人迫胁,莫敢正言;终有望夷之败,祖宗焚灭,污辱至今,永为世鉴。及臻吕后季年,产禄专政,内兼二军,外统梁、赵;擅断万机,决事省禁;下陵上替,海内寒心。于是绛侯朱虚兴兵奋怒,诛夷逆暴,尊立太宗,故能王道兴隆,光明显融:此则大臣立权之明表也。司空曹操:祖父中常侍腾,与左悺、徐璜并作妖孽,饕餮放横,伤化虐民;父嵩,乞匄携养,因赃假位,舆金辇璧,输货权门,窃盗鼎司,倾覆重器。操赘阉遗丑,本无懿德,犭票狡锋协,好乱乐祸。幕府董统鹰扬,扫除凶逆;续遇董卓,侵官暴国。于是提剑挥鼓,发命东夏,收罗英雄,弃瑕取用;故遂与操同谘合谋,授以裨师,谓其鹰犬之才,爪牙可任。至乃愚佻短略,轻进易退,伤夷折衄,数丧师徒;幕府辄复分兵命锐,修完补辑,表行东郡,领兖州刺史,被以虎文,奖戚威柄,冀获秦师一克之报。而操遂承资跋扈,恣行凶忒,割剥元元,残贤害善。故九江太守边让,英才俊伟,天下知名;直言正色,论不阿谄;身首被枭悬之诛,妻孥受灰灭之咎。自是士林愤痛,民怨弥重;一夫奋臂,举州同声。故躬破于徐方,地夺于吕布;彷徨东裔,蹈据无所。幕府惟强干弱枝之义,且不登叛人之党,故复援旌擐甲,席卷起征,金鼓响振,布众奔沮;拯其死亡之患,复其方伯之位:则幕府无德于兖土之民,而有大造于操也。后会銮驾返旆,群虏寇攻。时冀州方有北鄙之警,匪遑离局;故使从事中郎徐勋,就发遣操,使缮修郊庙,翊卫幼主。操便放志:专行胁迁,当御省禁;卑侮王室,败法乱纪;坐领三台,专制朝政;爵赏由心,弄戮在口;所爱光五宗,所恶灭三族;群谈者受显诛,腹议者蒙隐戮;百僚钳口,道路以目;尚书记朝会,公卿充员品而已故太尉杨彪,典历二司,享国极位。操因缘眦睚,被以非罪;榜楚参并,五毒备至;触情任忒,不顾宪纲。又议郎赵彦,忠谏直言,义有可纳,是以圣朝含听,改容加饰。';
    declare words varchar(45) default 'abcdefghijklmnopqrstuvwxyz-_';

    drop table if exists `users`;

    CREATE TABLE `users` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `uid` CHAR(10) NOT NULL,
    `name` VARCHAR(45) NOT NULL,
    `age` TINYINT(2) UNSIGNED NOT NULL,
    `count` DECIMAL(6 , 2 ) NOT NULL,
    `image` varchar(255) default '',
    `content` text,
    `status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)  ENGINE=INNODB DEFAULT CHARSET=UTF8MB4;

    START TRANSACTION;

    WHILE i <= 100000000 DO
        SELECT CEILING( RAND( ) * 9000000000+1000000000 ) INTO uid;
        SELECT FLOOR(18 + (RAND() * 9)) INTO age;
        SELECT ROUND((10 + (RAND() * 1001)), 2) INTO count;
        SELECT SUBSTRING(xing,FLOOR(1 + RAND() * l_xing),1) INTO final_xing;

        # 根据是否能被3整除,生成1个字或2个字的名字    
        if i % 3 = 0 then
            select substring(ming, floor(1+rand()*l_ming),1) into final_ming;
        else 
            select substring(ming, floor(1+rand()*l_ming),2) into final_ming;
        end if;

        SELECT CONCAT(final_xing, final_ming) INTO name;

        # 组装image字段数据
        select  concat('images/', substring(words, floor(rand() * (length(words)-5)), 5), '_thumbnail.jpg') into image;

        # 组装content数据
        select substring(texts, floor(rand()*10), floor(10+rand()*length(texts)/3)) into content;

        # 根据能否被5整除,设置status的值
        IF i % 5 = 0 THEN
            set status = 1;
        END IF;

        INSERT INTO users ( uid, name, age, count, image, content, status) VALUES ( uid, name, age, count, image, content, status);
        SET i = i + 1;

    END WHILE;
    COMMIT;

END
本作品采用《CC 协议》,转载必须注明作者和本文链接
code海老白鱼
讨论数量: 1
秦晓武

亲~这是一篇讲代码的还是讲技术的啊?

如果重点是存储过程的编写,有好多地方不明白:

  • 为何要加事务?
  • uid是个char,为何用随机数赋值?

如果重点是运行效率,差个运行结果

3年前 评论
嫌疑人螺某 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!