mysql中使用儲存過程生成1億條資料

嫌疑人螺某發表於2020-10-13

參考 mysql儲存過程-菜鳥教程
參考 mysql利用儲存過程批量插入一千萬資料(半小時)

最近準備深入學習下mysql索引及事務相關知識,資料量太小的話sql效率反饋不是很直觀,先記錄下第一批資料,後面根據需要再更新更多其他型別的欄位。

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海老白魚

相關文章