最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一步步教你利用Mysql存儲過程造百萬級數(shù)據(jù)

 更新時間:2023年03月18日 10:03:13   作者:自律的西瓜L  
因工作需要維護一張中建表數(shù)據(jù)內(nèi)置,所以得造數(shù)據(jù)所以使用存儲過程來造數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于如何一步步利用Mysql存儲過程造百萬級數(shù)據(jù)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下

1.準(zhǔn)備工作

(1)由于是使用存儲過程,mysql從5.0版開始支持存儲過程,那么需要mysql的版本在5.0或者以上。如何查看mysql的版本,使用下面sql語句查看:

(2)創(chuàng)建兩張表,表結(jié)構(gòu)一致,但使用的存儲引擎不一樣,如下所示,普通表使用mysql5.5版本后默認(rèn)的INNODB存儲引擎,內(nèi)存表使用MEMORY存儲引擎。

由于MEMORY存儲不常用這里簡單說一下其特點:MEMORY引擎表結(jié)構(gòu)創(chuàng)建在磁盤上,數(shù)據(jù)全部放在內(nèi)存中,訪問速度較快,但是當(dāng)MySQL重啟后或者一旦系統(tǒng)奔潰的話,數(shù)據(jù)都會消失,結(jié)構(gòu)還存在。

# 創(chuàng)建普通表
CREATE TABLE `user_info` (
    `id` INT ( 11 ) NOT NULL AUTO_INCREMENT COMMENT 'ID',
    `name` VARCHAR ( 30 ) NOT NULL COMMENT '用戶名',
    `phone` VARCHAR ( 11 ) NOT NULL COMMENT '手機號',
    `status` TINYINT ( 1 ) NULL DEFAULT NULL COMMENT '用戶狀態(tài):停用0,啟動1',
    `create_time` datetime NOT NULL COMMENT '創(chuàng)建時間',
    PRIMARY KEY ( `id` ) USING BTREE 
) ENGINE = INNODB AUTO_INCREMENT = 10001 CHARACTER 
SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶信息表';
 
# 創(chuàng)建內(nèi)存表
CREATE TABLE `memory_user_info` (
    `id` INT ( 11 ) NOT NULL AUTO_INCREMENT COMMENT 'ID',
    `name` VARCHAR ( 30 ) NOT NULL COMMENT '用戶名',
    `phone` VARCHAR ( 11 ) NOT NULL COMMENT '手機號',
    `status` TINYINT ( 1 ) NULL DEFAULT NULL COMMENT '用戶狀態(tài):停用0,啟動1',
    `create_time` datetime NOT NULL COMMENT '創(chuàng)建時間',
    PRIMARY KEY ( `id` ) USING BTREE 
) ENGINE = MEMORY AUTO_INCREMENT = 10001 CHARACTER 
SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶信息內(nèi)存表';

2.主要實現(xiàn)步驟

(1)創(chuàng)建自動生成數(shù)據(jù)的函數(shù),插入時使用;

(2)創(chuàng)建插入內(nèi)存表數(shù)據(jù)存儲過程,調(diào)用已創(chuàng)建好的數(shù)據(jù)生成函數(shù);

(3)創(chuàng)建內(nèi)存表數(shù)據(jù)插入普通表存儲過程;

(4)調(diào)用存儲過程。

(5)數(shù)據(jù)查看驗證

3.創(chuàng)建自動生成數(shù)據(jù)的函數(shù)

(1)生成n個隨機數(shù)字

DELIMITER //
DROP FUNCTION
IF
    EXISTS randomNum // CREATE FUNCTION randomNum (
        n INT,
        chars_str VARCHAR ( 10 )) RETURNS VARCHAR ( 255 ) BEGIN
    DECLARE
        return_str VARCHAR ( 255 ) DEFAULT '';
    DECLARE
        i INT DEFAULT 0;
    WHILE
            i < n DO
            
            SET return_str = concat(
                return_str,
            substring( chars_str, FLOOR( 1 + RAND()* 10 ), 1 ));
        
        SET i = i + 1;
        
    END WHILE;
    RETURN return_str;
    
END // 
DELIMITER;

函數(shù)運行截圖:

腳本所用到的mysql函數(shù)及其功能如下:

a.concat():將多個字符串連接成一個字符串。

b.Floor():向下取整。

c.substring(string, position, length)

第一個參數(shù):string指的是需要截取的原字符串。

第二個參數(shù):position指的是從哪個位置開始截取子字符串,這里字符的位置編碼序號是從1開始,若position為負(fù)數(shù)則從右往左開始數(shù)位置。

第三個參數(shù):length指的是需要截取的字符串長度,如果不寫,則默認(rèn)截取從position開始到最后一位的所有字符。

d.RAND():只能生成0到1之間的隨機小數(shù)。

(2)創(chuàng)建隨機生成手機號函數(shù)

DELIMITER //
DROP FUNCTION
IF
    EXISTS getPhone // CREATE FUNCTION getPhone () RETURNS VARCHAR ( 11 ) BEGIN
    DECLARE
        head CHAR ( 3 );
    DECLARE
        phone VARCHAR ( 11 );
    DECLARE
        bodys VARCHAR ( 65 ) DEFAULT "130 131 132 133 134 135 136 137 138 139 186 187 189 151 157";
    DECLARE
        STARTS INT;
    
    SET STARTS = 1+floor ( rand()* 15 )* 4;
    
    SET head = trim(
    substring( bodys, STARTS, 3 ));
    
    SET phone = trim(
        concat(
            head,
        randomNum ( 8, '0123456789' )));
    RETURN phone;
    
END // 
DELIMITER;

函數(shù)運行截圖:

(3)創(chuàng)建隨機生成用戶名函數(shù)

DELIMITER //
DROP FUNCTION
IF
    EXISTS randName // CREATE FUNCTION randName ( n INT ) RETURNS VARCHAR ( 255 ) CHARSET utf8mb4 DETERMINISTIC BEGIN
    DECLARE
        chars_str VARCHAR ( 100 ) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    DECLARE
        return_str VARCHAR ( 30 ) DEFAULT '';
    DECLARE
        i INT DEFAULT 0;
    WHILE
            i < n DO
            
            SET return_str = concat(
                return_str,
            substring( chars_str, FLOOR( 1 + RAND() * 62 ), 1 ));
        
        SET i = i + 1;
        
    END WHILE;
    RETURN return_str;
 
END // 
DELIMITER;

函數(shù)運行截圖:

(4)隨機生成用戶狀態(tài)函數(shù)

DELIMITER //
DROP FUNCTION
IF
    EXISTS randStatus // CREATE FUNCTION randStatus ( ) RETURNS TINYINT ( 1 ) BEGIN
    DECLARE
        user_status INT ( 1 ) DEFAULT 0;
    
    SET user_status =
    IF
        ( FLOOR( RAND() * 10 ) <= 4, 1, 0 );
    RETURN user_status;
 
END // 
DELIMITER;

函數(shù)運行截圖:

(5)查看數(shù)據(jù)庫中所有自定義函數(shù)信息

4.創(chuàng)建存儲過程

(1)創(chuàng)建插入內(nèi)存表數(shù)據(jù)存儲過程

DELIMITER //
DROP FUNCTION
IF
    EXISTS randStatus // CREATE FUNCTION randStatus ( ) RETURNS TINYINT ( 1 ) BEGIN
    DECLARE
        user_status INT ( 1 ) DEFAULT 0;
    
    SET user_status =
    IF
        ( FLOOR( RAND() * 10 ) <= 4, 1, 0 );
    RETURN user_status;
 
END // 
DELIMITER;

入?yún)是多少就表示往內(nèi)存表memory_user_info插入多少條數(shù)據(jù)

存儲過程運行截圖:

(2)創(chuàng)建內(nèi)存表數(shù)據(jù)插入普通表存儲過程

DELIMITER //
DROP PROCEDURE
IF
    EXISTS add_user_info // CREATE PROCEDURE `add_user_info` ( IN n INT, IN count INT ) BEGIN
    DECLARE
        i INT DEFAULT 1;
    WHILE
            ( i <= n ) DO
            CALL add_memory_user_info ( count );
        INSERT INTO user_info SELECT
        * 
        FROM
            memory_user_info;
        DELETE 
        FROM
            memory_user_info;
        
        SET i = i + 1;
        
    END WHILE;
 
END // 
DELIMITER;

這是最主要的存儲過程,也是入口,利用對內(nèi)存表的循環(huán)插入和刪除來實現(xiàn)批量生成數(shù)據(jù),不需要更改mysql默認(rèn)的max_heap_table_size值(默認(rèn)值是16M),max_heap_table_size 的作用是配置用戶創(chuàng)建內(nèi)存臨時表的大小,配置的值越大,能存進內(nèi)存表的數(shù)據(jù)就越多。

存儲過程運行截圖:

(3)查看存儲過程的狀態(tài)

-- 查看數(shù)據(jù)庫所有的存儲過程
SHOW PROCEDURE STATUS;
-- 模糊查詢存儲過程
SHOW PROCEDURE STATUS LIKE 'add%';

模糊查詢結(jié)果:

5.調(diào)用存儲過程

mysql稱存儲過程的執(zhí)行為調(diào)用,因此mysql執(zhí)行存儲過程的語句為CALL。CALL接受存儲過程的名字以及需要傳遞給它的任意參數(shù)。

通過調(diào)用add_user_info存儲過程,不斷循環(huán)插入內(nèi)存表memory_user_info,再從內(nèi)存表獲取數(shù)據(jù)插入普通表user_info,然后刪除內(nèi)存表數(shù)據(jù),以此循環(huán)直至循環(huán)結(jié)束。循環(huán)100次,每次生成10000條數(shù)據(jù),共生成一百萬條數(shù)據(jù)。

CALL add_user_info(100,10000);

6.數(shù)據(jù)查看驗證

在普通表數(shù)據(jù)達到6萬條時,已經(jīng)耗時大概在23分鐘左右,以這個時間推算,100萬數(shù)據(jù)生成預(yù)計需要6小時左右。耗時的點主要是在四個隨機生成字段數(shù)據(jù)的函數(shù)上。如果字段數(shù)據(jù)不要求隨機,那么將會快很多。

數(shù)據(jù)記錄如下效果:

總結(jié)

到此這篇關(guān)于一步步教你利用Mysql存儲過程造百萬級數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Mysql存儲過程造百萬級數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析mysql union和union all

    淺析mysql union和union all

    union 是對數(shù)據(jù)進行并集操作,不包括重復(fù)行,同時進行默認(rèn)排序而Union all 是對數(shù)據(jù)進行并集操作,包括重復(fù)行,不進行排序,下面給大家詳細(xì)介紹mysql union和union all,感興趣的朋友一起看看吧
    2017-10-10
  • MySQL?日志表改造為分區(qū)表

    MySQL?日志表改造為分區(qū)表

    本文主要介紹了MySQL?日志表改造為分區(qū)表,以解決業(yè)務(wù)日志表占用大量存儲空間且刪除操作慢的問題,下面就來具體介紹一下,感興趣的可以了解一下
    2025-02-02
  • Centos7下使用yum安裝mysql數(shù)據(jù)庫的詳細(xì)教程(增強版)

    Centos7下使用yum安裝mysql數(shù)據(jù)庫的詳細(xì)教程(增強版)

    這篇文章主要介紹了Centos7下使用yum安裝mysql數(shù)據(jù)庫的詳細(xì)教程(增強版),非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • MySQL啟動失敗報錯:mysqld.service failed to run ‘start-pre‘ task的問題分析與解決方案

    MySQL啟動失敗報錯:mysqld.service failed to run 

    在日常運維中,MySQL 作為廣泛應(yīng)用的關(guān)系型數(shù)據(jù)庫,其穩(wěn)定性和可用性至關(guān)重要,然而,有時系統(tǒng)升級或配置變更后,MySQL 服務(wù)可能會出現(xiàn)無法啟動的問題,本文針對某次實際案例進行深入分析和處理,需要的朋友可以參考下
    2024-12-12
  • MySQL分區(qū)表的最佳實踐指南

    MySQL分區(qū)表的最佳實踐指南

    這篇文章主要給大家介紹了關(guān)于MySQL分區(qū)表的最佳實踐指南,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Mysql慢查詢?nèi)罩疚募D(zhuǎn)Excel的方法

    Mysql慢查詢?nèi)罩疚募D(zhuǎn)Excel的方法

    面對公司生產(chǎn)環(huán)境中慢SQL問題的排查工作,由于日志文件格式混亂,相關(guān)資料無法提供便捷的格式化處理工具,故而自主編寫一套Java讀取慢SQL日志轉(zhuǎn)為Excel的小工具,該工具可以有效提升排查工作的效率,方便快捷地解決問題
    2024-10-10
  • mysql、oracle默認(rèn)事務(wù)隔離級別的說明

    mysql、oracle默認(rèn)事務(wù)隔離級別的說明

    這篇文章主要介紹了mysql、oracle默認(rèn)事務(wù)隔離級別的說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 淺談mysql的sql_mode可能會限制你的查詢

    淺談mysql的sql_mode可能會限制你的查詢

    本文主要介紹了淺談mysql的sql_mode可能會限制你的查詢,這個問題主要說明的是,我們寫的sql查詢語句違背了聚合函數(shù)group?by的規(guī)則,下面就來介紹一下解決方法,感興趣的可以了解一下
    2025-03-03
  • 親手教你怎樣創(chuàng)建一個簡單的mysql數(shù)據(jù)庫

    親手教你怎樣創(chuàng)建一個簡單的mysql數(shù)據(jù)庫

    數(shù)據(jù)庫是存放數(shù)據(jù)的“倉庫”,維基百科對此形象地描述為“電子化文件柜”,這篇文章主要介紹了親手教你怎樣創(chuàng)建一個簡單的mysql數(shù)據(jù)庫,需要的朋友可以參考下
    2022-11-11
  • mysql查看連接數(shù)和設(shè)置會話超時問題

    mysql查看連接數(shù)和設(shè)置會話超時問題

    這篇文章主要介紹了mysql查看連接數(shù)和設(shè)置會話超時問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

中西区| 梅州市| 洮南市| 碌曲县| 女性| 西昌市| 凤山市| 于都县| 富源县| 库尔勒市| 沙雅县| 平阴县| 昆山市| 朝阳县| 昌吉市| 永新县| 页游| 同江市| 五台县| 宁德市| 嘉黎县| 阿尔山市| 墨竹工卡县| 阜宁县| 阿克陶县| 林口县| 绥芬河市| 淮阳县| 惠东县| 邓州市| 高唐县| 巩义市| 白山市| 灵石县| 吉林市| 灵寿县| 临沧市| 永兴县| 乐陵市| 山东省| 辰溪县|