欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL如何實(shí)現(xiàn)快速插入大量測(cè)試數(shù)據(jù)

 更新時(shí)間:2023年11月24日 08:51:16   作者:云滿筆記  
這篇文章主要介紹了MySQL如何實(shí)現(xiàn)快速插入大量測(cè)試數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.1. 簡(jiǎn)述

開發(fā)過(guò)程中經(jīng)常需要測(cè)試 SQL 在大量數(shù)據(jù)集時(shí)候的執(zhí)行效率, 這就需要我們?cè)诒碇胁迦氪罅康臏y(cè)試數(shù)據(jù), 下面介紹如何使用存儲(chǔ)過(guò)程插入大量的測(cè)試數(shù)據(jù)

1.2. 定義常用方法

我們要確保生成的測(cè)試數(shù)據(jù)要有足夠的隨機(jī)性, 測(cè)試結(jié)果才會(huì)更準(zhǔn)確, 如果某個(gè)字段的測(cè)試數(shù)據(jù)都是一樣的, 索引的效率會(huì)大大折扣, 測(cè)試結(jié)果往往與真實(shí)數(shù)據(jù)的執(zhí)行結(jié)果大相徑庭

我們可以使用 MySQL 的自定義函數(shù)來(lái)實(shí)現(xiàn)隨機(jī)值的生成, 下面羅列出幾種常見(jiàn)的字段的函數(shù)定義

1.2.1. 生成隨機(jī)時(shí)間

函數(shù)聲明:

CREATE DEFINER=`root`@`%` FUNCTION `genDate`(
    start_time VARCHAR(10),
    end_time VARCHAR(10)
) RETURNS VARCHAR(255) CHARSET utf8mb4
BEGIN
  DECLARE random_date DATETIME DEFAULT NULL;
  SET random_date = CONCAT(
    (DATE(FROM_UNIXTIME(UNIX_TIMESTAMP(start_time) + FLOOR(RAND() * (UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time) + 1))))), 
      ' ',  
            FLOOR(RAND() * 24),  ':', FLOOR(RAND() * 60), ':', FLOOR(RAND() * 60)
    );
  RETURN date_format(random_date,'%Y-%m-%d %H:%i:%s');
END

使用示例:

生成 2020-01-01 ~ 2023-01-01 時(shí)間段內(nèi)的隨機(jī)時(shí)間

> select genDate('2020-01-01','2023-01-01');
2020-06-22 4:25:35

1.2.2. 生成中文名

函數(shù)聲明:

CREATE DEFINER=`root`@`%` FUNCTION `genUsername`() RETURNS varchar(255) CHARSET utf8mb4
BEGIN
    DECLARE first_name_dict VARCHAR(2056) DEFAULT '趙錢孫李周鄭王馮陳楮衛(wèi)蔣沈韓楊朱秦尤許何呂施張孔曹嚴(yán)華金魏陶姜戚謝喻柏水竇章云蘇潘葛奚范彭郎魯韋昌馬苗鳳花方俞任袁柳酆鮑史唐費(fèi)廉岑薛雷賀倪湯滕殷羅畢郝鄔安常樂(lè)于時(shí)傅皮齊康伍余元卜顧孟平黃和穆蕭尹姚邵湛汪祁毛禹狄米貝明臧計(jì)伏成戴談宋茅龐熊紀(jì)舒屈項(xiàng)祝董梁杜阮藍(lán)閩席季麻強(qiáng)賈路婁危江童顏郭梅盛林刁鍾徐丘駱高夏蔡田樊胡凌霍虞萬(wàn)支柯昝管盧莫經(jīng)裘繆干解應(yīng)宗丁宣賁鄧郁單杭洪包諸左石崔吉鈕龔程嵇邢滑裴陸榮翁';
    DECLARE last_name_dict VARCHAR(2056) DEFAULT '嘉懿煜城懿軒燁偉苑博偉澤熠彤鴻煊博濤燁霖?zé)钊A煜祺智宸正豪昊然明杰誠(chéng)立軒立輝峻熙弘文熠彤鴻煊燁霖哲瀚鑫鵬致遠(yuǎn)俊馳雨澤燁磊晟睿天佑文昊修潔黎昕遠(yuǎn)航旭堯鴻濤偉祺軒越澤浩宇瑾瑜皓軒擎蒼擎宇志澤睿淵楷瑞軒弘文哲瀚雨澤鑫磊夢(mèng)琪憶之桃慕青問(wèn)蘭爾嵐元香初夏沛菡傲珊曼文樂(lè)菱癡珊恨玉惜文香寒新柔語(yǔ)蓉海安夜蓉涵柏水桃醉藍(lán)春兒語(yǔ)琴?gòu)耐燎缯Z(yǔ)蘭又菱碧彤元霜憐夢(mèng)紫寒妙彤曼易南蓮紫翠雨寒易煙如萱若南尋真曉亦向珊慕靈以蕊尋雁映易雪柳孤嵐笑霜海云凝天沛珊寒云冰旋宛兒綠真盼兒曉霜碧凡夏菡曼香若煙半夢(mèng)雅綠冰藍(lán)靈槐平安書翠翠風(fēng)香巧代云夢(mèng)曼幼翠友巧聽寒夢(mèng)柏醉易訪旋亦玉凌萱訪卉懷亦笑藍(lán)春翠靖柏夜蕾冰夏夢(mèng)松書雪樂(lè)楓念薇靖雁尋春恨山從寒憶香覓波靜曼凡旋以亦念露芷蕾千蘭新波代真新蕾雁玉冷卉紫山千琴恨天傲芙盼山懷蝶冰蘭山柏翠萱樂(lè)丹翠柔谷山之瑤冰露爾珍谷雪樂(lè)萱涵菡海蓮傲蕾青槐冬兒易夢(mèng)惜雪宛海之柔夏青亦瑤妙菡春竹修杰偉誠(chéng)建輝晉鵬天磊紹輝澤洋明軒健柏煊昊強(qiáng)偉宸博超君浩子騫明輝鵬濤炎彬鶴軒越彬風(fēng)華靖琪明誠(chéng)高格光華國(guó)源宇晗昱涵潤(rùn)翰飛翰海昊乾浩博和安弘博鴻朗華奧華燦嘉慕堅(jiān)秉建明金鑫錦程瑾瑜鵬經(jīng)賦景同靖琪君昊俊明季同開濟(jì)凱安康成樂(lè)語(yǔ)力勤良哲理群茂彥敏博明達(dá)朋義彭澤鵬舉濮存溥心璞瑜浦澤奇邃祥榮軒';
    DECLARE first_name VARCHAR(3) DEFAULT substring(first_name_dict, floor(length(first_name_dict) / 3 * rand()), 1);
    DECLARE last_name VARCHAR(9);
    DECLARE full_name_length INT DEFAULT FLOOR(2+(RAND()*3))*3;
    DECLARE full_name VARCHAR(12) DEFAULT first_name;
    
  WHILE LENGTH(full_name) < full_name_length DO
        SET full_name = CONCAT(full_name, substring(last_name_dict, floor(length(last_name_dict) / 3 * rand()), 1));
    END WHILE;
    
    return full_name;
END

使用示例:

> select genUsername();
凌之澤

1.2.3. 字符串分割選取

函數(shù)聲明:

CREATE FUNCTION `splitStr` (
  str VARCHAR (1000),
  delimiter VARCHAR (5),
  str_order INT
) RETURNS VARCHAR (255) CHARSET utf8mb4 DETERMINISTIC
BEGIN
  DECLARE result VARCHAR (255) DEFAULT '';

  SET result = REVERSE(
    substring_index(
      REVERSE(
        substring_index(
          str,
          delimiter,
          str_order
        )
      ),
      delimiter,
      1
    )
  );
  RETURN result;
END

使用示例: 該函數(shù)用于將字符串按照指定的分割符進(jìn)行分割, 并返回分割后的第 n(n 由參數(shù)指定) 個(gè)字符串, 如取字符串"I love MySQL"按空格分割后的第 2 個(gè)字符串

> select splitStr('I love MySQL',' ','2);
love

1.2.4. 生成隨機(jī)手機(jī)號(hào)

函數(shù)聲明:

CREATE DEFINER=`root`@`%` FUNCTION `genMobile`() RETURNS char(11) CHARSET utf8mb4 NOT DETERMINISTIC
BEGIN
    DECLARE head VARCHAR(100) DEFAULT '132,133,139,183,186,187,130,131,189,151,156,157,176,134,135,137,138,136,000';
    DECLARE content CHAR(10) DEFAULT '0123456789';
    DECLARE phone CHAR(20) DEFAULT splitStr(head, ',', FLOOR(1 + RAND() * 19));
    DECLARE i int DEFAULT 1;
  
    WHILE i<9 DO
        SET i=i+1;
        SET phone = CONCAT(phone, substring(content, floor(1 + RAND() * 10), 1));
    END WHILE;
    RETURN phone;
END

使用示例:

> select genMobile();
18975304923

1.3. 插入大量測(cè)試數(shù)據(jù)

如下面這張表, 現(xiàn)在要插入 10w 的測(cè)試數(shù)據(jù), 我們可以定義一個(gè) MySQL 存儲(chǔ)過(guò)程, 通過(guò)存儲(chǔ)過(guò)程的方式插入數(shù)據(jù)到表中

表結(jié)構(gòu)

CREATE TABLE `t_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `sex` tinyint(1) DEFAULT NULL,
  `mobile` varchar(45) DEFAULT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`),
  KEY `idx_create_time` (`create_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8mb4

存儲(chǔ)過(guò)程定義

CREATE DEFINER=`root`@`%` PROCEDURE `t_user_batch_insert`(IN size INT)
BEGIN
  declare i int default 0;
    while i < size do
    insert into t_user(username,sex,mobile) values(genUsername(),floor(rand() * 2),genMobile());
        set i = i + 1;
    end while;
END

調(diào)用存儲(chǔ)過(guò)程

> call t_user_batch_insert(100000);

在我這邊, 插入 10w 條數(shù)據(jù), 只要 52s

1.3.1. 延伸

除了使用存儲(chǔ)過(guò)程的方法插入數(shù)據(jù)外, 還可以通過(guò)代碼的方式插入數(shù)據(jù), 但是該方法的執(zhí)行效率不高。

另外, 如果你有 navicat 的話, 也可以試試 navicat 的數(shù)據(jù)生成方案, 由于我沒(méi)有 navicat, 就不介紹了, 感興趣的可以看 navicat 的文檔

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql按照天統(tǒng)計(jì)報(bào)表當(dāng)天沒(méi)有數(shù)據(jù)填0的實(shí)現(xiàn)代碼

    mysql按照天統(tǒng)計(jì)報(bào)表當(dāng)天沒(méi)有數(shù)據(jù)填0的實(shí)現(xiàn)代碼

    這篇文章主要介紹了mysql按照天統(tǒng)計(jì)報(bào)表當(dāng)天沒(méi)有數(shù)據(jù)填0的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-01-01
  • MySQL分區(qū)表語(yǔ)法解讀

    MySQL分區(qū)表語(yǔ)法解讀

    MySQL分區(qū)表主要用于提高查詢效率,通過(guò)將數(shù)據(jù)分割成更小的部分進(jìn)行管理,文章詳細(xì)介紹了如何創(chuàng)建、查詢、修改和存儲(chǔ)分區(qū)表,包括創(chuàng)建復(fù)合主鍵、按年份和月份分區(qū)、刪除分區(qū)、查詢分區(qū)數(shù)據(jù)以及利用存儲(chǔ)過(guò)程批量轉(zhuǎn)換非分區(qū)表為分區(qū)表等方法
    2025-02-02
  • 一文帶大家由淺入深的了解MySQL底層查詢邏輯

    一文帶大家由淺入深的了解MySQL底層查詢邏輯

    這篇文章主要給大家詳細(xì)介紹了MySQL底層查詢邏輯,文中有詳細(xì)的代碼示例和圖文介紹,具有一定的參考價(jià)值,感興趣的同學(xué)可以借鑒閱讀
    2023-06-06
  • mysql如何能有效防止刪庫(kù)跑路

    mysql如何能有效防止刪庫(kù)跑路

    本文主要介紹了mysql如何能有效防止刪庫(kù)跑路,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MySQL中的?DQL?聚合函數(shù)詳解

    MySQL中的?DQL?聚合函數(shù)詳解

    SQL聚合函數(shù)是一組函數(shù),用于計(jì)算并返回?cái)?shù)據(jù)集的單個(gè)值,這些函數(shù)通常用于在SELECT語(yǔ)句中匯總數(shù)據(jù),本文給大家介紹MySQL中的DQL聚合函數(shù),感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • MySQL數(shù)據(jù)庫(kù)如何克隆(帶腳本)

    MySQL數(shù)據(jù)庫(kù)如何克隆(帶腳本)

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)如何克隆(帶腳本)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • deepin 2014系統(tǒng)下安裝mysql數(shù)據(jù)庫(kù)的方法步驟

    deepin 2014系統(tǒng)下安裝mysql數(shù)據(jù)庫(kù)的方法步驟

    這篇文章主要給大家介紹了在deepin 2014系統(tǒng)下安裝mysql數(shù)據(jù)庫(kù)的方法步驟,文中通過(guò)圖文介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-04-04
  • mysql 5.7.14 安裝配置代碼分享

    mysql 5.7.14 安裝配置代碼分享

    這篇文章主要為大家分享了CentOS 6.6下mysql 5.7.13winx64安裝配置方法圖文教程,感興趣的朋友可以參考一下
    2016-09-09
  • Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟

    Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟

    這篇文章主要介紹了Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟,包括創(chuàng)建文件夾、編寫腳本、設(shè)置定時(shí)任務(wù)和測(cè)試腳本,詳細(xì)步驟涵蓋從文件夾創(chuàng)建到腳本執(zhí)行的全過(guò)程,幫助用戶實(shí)現(xiàn)數(shù)據(jù)庫(kù)的自動(dòng)備份,需要的朋友可以參考下
    2024-11-11
  • MySQL使用innobackupex備份連接服務(wù)器失敗的解決方法

    MySQL使用innobackupex備份連接服務(wù)器失敗的解決方法

    這篇文章主要為大家詳細(xì)介紹了MySQL使用innobackupex備份連接服務(wù)器失敗的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02

最新評(píng)論