91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Mysql存儲過程造百萬級數據

發布時間:2023-03-22 16:24:56 來源:億速云 閱讀:112 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“怎么用Mysql存儲過程造百萬級數據”,內容詳細,步驟清晰,細節處理妥當,希望這篇“怎么用Mysql存儲過程造百萬級數據”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

1.準備工作

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

怎么用Mysql存儲過程造百萬級數據

(2)創建兩張表,表結構一致,但使用的存儲引擎不一樣,如下所示,普通表使用mysql5.5版本后默認的INNODB存儲引擎,內存表使用MEMORY存儲引擎。

由于MEMORY存儲不常用這里簡單說一下其特點:MEMORY引擎表結構創建在磁盤上,數據全部放在內存中,訪問速度較快,但是當MySQL重啟后或者一旦系統奔潰的話,數據都會消失,結構還存在。

# 創建普通表
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 '用戶狀態:停用0,啟動1',
    `create_time` datetime NOT NULL COMMENT '創建時間',
    PRIMARY KEY ( `id` ) USING BTREE 
) ENGINE = INNODB AUTO_INCREMENT = 10001 CHARACTER 
SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶信息表';
 
# 創建內存表
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 '用戶狀態:停用0,啟動1',
    `create_time` datetime NOT NULL COMMENT '創建時間',
    PRIMARY KEY ( `id` ) USING BTREE 
) ENGINE = MEMORY AUTO_INCREMENT = 10001 CHARACTER 
SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶信息內存表';

2.主要實現步驟

(1)創建自動生成數據的函數,插入時使用;

(2)創建插入內存表數據存儲過程,調用已創建好的數據生成函數;

(3)創建內存表數據插入普通表存儲過程;

(4)調用存儲過程。

(5)數據查看驗證

3.創建自動生成數據的函數

(1)生成n個隨機數字

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;

函數運行截圖:

怎么用Mysql存儲過程造百萬級數據

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

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

b.Floor():向下取整。

c.substring(string, position, length)

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

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

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

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

(2)創建隨機生成手機號函數

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;

函數運行截圖:

怎么用Mysql存儲過程造百萬級數據

(3)創建隨機生成用戶名函數

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;

函數運行截圖:

怎么用Mysql存儲過程造百萬級數據

(4)隨機生成用戶狀態函數

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;

函數運行截圖:

怎么用Mysql存儲過程造百萬級數據

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

怎么用Mysql存儲過程造百萬級數據

4.創建存儲過程

(1)創建插入內存表數據存儲過程

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;

入參n是多少就表示往內存表memory_user_info插入多少條數據

存儲過程運行截圖:

怎么用Mysql存儲過程造百萬級數據

(2)創建內存表數據插入普通表存儲過程

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;

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

存儲過程運行截圖:

怎么用Mysql存儲過程造百萬級數據

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

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

模糊查詢結果:

怎么用Mysql存儲過程造百萬級數據

5.調用存儲過程

mysql稱存儲過程的執行為調用,因此mysql執行存儲過程的語句為CALL。CALL接受存儲過程的名字以及需要傳遞給它的任意參數。

通過調用add_user_info存儲過程,不斷循環插入內存表memory_user_info,再從內存表獲取數據插入普通表user_info,然后刪除內存表數據,以此循環直至循環結束。循環100次,每次生成10000條數據,共生成一百萬條數據。

CALL add_user_info(100,10000);

6.數據查看驗證

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

怎么用Mysql存儲過程造百萬級數據

數據記錄如下效果:

怎么用Mysql存儲過程造百萬級數據

讀到這里,這篇“怎么用Mysql存儲過程造百萬級數據”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴林右旗| 琼海市| 菏泽市| 诸暨市| 淮安市| 河北省| 汪清县| 介休市| 正安县| 营山县| 西乌珠穆沁旗| 息烽县| 南城县| 开鲁县| 苍溪县| 怀远县| 盐源县| 乾安县| 新兴县| 谢通门县| 怀仁县| 通榆县| 宜良县| 吴旗县| 定西市| 宝兴县| 从江县| 雅安市| 英山县| 福州市| 新竹市| 巴中市| 徐汇区| 肥乡县| 吉木乃县| 喀喇| 汝城县| 土默特左旗| 和顺县| 开平市| 阿拉善右旗|