Rumah  >  Artikel  >  pangkalan data  >  Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data

WBOY
WBOYke hadapan
2023-06-03 19:40:011146semak imbas

1. Persediaan

(1) Memandangkan prosedur tersimpan digunakan, mysql menyokong prosedur tersimpan bermula dari versi 5.0, jadi versi mysql perlu 5.0 atau lebih tinggi. Bagaimana untuk menyemak versi mysql, gunakan pernyataan sql berikut untuk menyemak:

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data

(2) Buat dua jadual dengan struktur jadual yang sama tetapi enjin storan berbeza, seperti yang ditunjukkan di bawah , Jadual biasa menggunakan enjin storan INNODB lalai selepas versi mysql5.5, dan jadual memori menggunakan enjin storan MEMORY.

Memandangkan storan MEMORY tidak biasa digunakan, berikut ialah pengenalan ringkas kepada ciri-cirinya: struktur jadual enjin MEMORY dicipta pada cakera, semua data diletakkan dalam memori, dan kelajuan akses adalah pantas, tetapi apabila MySQL dimulakan semula atau sebaik sahaja sistem ranap , data akan hilang, tetapi struktur akan tetap wujud.

# 创建普通表
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. Langkah-langkah pelaksanaan utama

(1) Buat fungsi yang menjana data secara automatik dan menggunakannya semasa memasukkan

(2) Buat prosedur penyimpanan data untuk memasukkan ke dalam jadual memori dan panggil Fungsi penjanaan data yang dicipta;

(3) Buat data jadual memori dan masukkannya ke dalam prosedur tersimpan jadual biasa

(4) Panggil prosedur tersimpan.

(5) Paparan dan pengesahan data

3 Cipta fungsi yang menjana data secara automatik

(1) Jana n nombor rawak

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;

Fungsi berjalan. tangkapan skrin :

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data

Fungsi mysql dan fungsinya yang digunakan dalam skrip adalah seperti berikut:

a.concat(): Menggabungkan berbilang rentetan menjadi satu rentetan.

b.Tingkat(): Bulat ke bawah.

c.substring(rentetan, kedudukan, panjang)

Parameter pertama: rentetan merujuk kepada rentetan asal yang perlu dipintas.

Parameter kedua: kedudukan merujuk kepada kedudukan untuk memintas subrentetan kedudukan nombor jujukan watak di sini bermula dari 1. Jika kedudukan ialah nombor negatif, kedudukan dikira dari kanan ke kiri. .

Parameter ketiga: panjang merujuk kepada panjang rentetan yang perlu dipintas Jika tidak ditulis, semua aksara dari permulaan kedudukan hingga aksara terakhir akan dipintas secara lalai.

d.RAND(): hanya boleh menjana perpuluhan rawak antara 0 dan 1.

(2) Cipta fungsi untuk menjana nombor telefon mudah alih secara rawak

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, &#39;0123456789&#39; )));
    RETURN phone;
    
END // 
DELIMITER;

Tangkapan skrin fungsi menjalankan:

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data

(3) Cipta fungsi untuk menjana nama pengguna secara rawak

DELIMITER //
DROP FUNCTION
IF
    EXISTS randName // CREATE FUNCTION randName ( n INT ) RETURNS VARCHAR ( 255 ) CHARSET utf8mb4 DETERMINISTIC BEGIN
    DECLARE
        chars_str VARCHAR ( 100 ) DEFAULT &#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&#39;;
    DECLARE
        return_str VARCHAR ( 30 ) DEFAULT &#39;&#39;;
    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;

fungsi menjalankan tangkapan skrin:

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data

(4) Menjana secara rawak fungsi status pengguna

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;

fungsi menjalankan tangkapan skrin:

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data

(5) Lihat semua maklumat fungsi tersuai dalam pangkalan data

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data

4 🎜>(1) Buat prosedur tersimpan untuk memasukkan data ke dalam jadual memori

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;

Parameter input n menunjukkan bilangan keping data yang dimasukkan ke dalam jadual memori memory_user_info

Tangkapan skrin disimpan prosedur berjalan:

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data (2) Cipta data jadual memori dan masukkan prosedur tersimpan jadual biasa

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;

Ini adalah prosedur tersimpan utama dan pintu masuk yang digunakan sisipan kitaran dan pemadaman jadual memori untuk menjana data dalam kelompok Tidak perlu menukar nilai lalai max_heap_table_size mysql (nilai lalai ialah 16M Fungsi max_heap_table_size adalah untuk mengkonfigurasi saiz jadual memori sementara yang dibuat oleh pengguna. Lebih besar nilai yang dikonfigurasikan, lebih banyak data boleh disimpan dalam jadual memori.

Tangkapan skrin menjalankan prosedur tersimpan:

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data (3) Lihat status prosedur tersimpan

-- 查看数据库所有的存储过程
SHOW PROCEDURE STATUS;
-- 模糊查询存储过程
SHOW PROCEDURE STATUS LIKE &#39;add%&#39;;

Hasil pertanyaan kabur:

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data5. Panggilan prosedur tersimpan

MySQL memanggil pelaksanaan prosedur tersimpan sebagai panggilan, jadi pernyataan yang digunakan oleh MySQL untuk melaksanakan prosedur tersimpan ialah CALL. CALL menerima nama prosedur yang disimpan dan sebarang parameter yang perlu dihantar kepadanya.

Dengan memanggil prosedur tersimpan add_user_info, masukkan jadual memori memory_user_info secara berterusan dalam gelung, kemudian dapatkan data daripada jadual memori dan masukkannya ke dalam jadual user_info biasa, dan kemudian padamkan data jadual memori, dan ini kitaran berterusan sehingga akhir gelung. Gelung 100 kali, menjana 10,000 keping data setiap kali, dan sejumlah satu juta keping data.

CALL add_user_info(100,10000);

6. Paparan dan pengesahan data

Apabila data jadual biasa mencapai 60,000, ia telah mengambil masa kira-kira 23 minit, dianggarkan ia akan mengambil masa 6 jam untuk dijana 1 juta data tentang. Titik yang memakan masa adalah terutamanya dalam empat fungsi yang menjana data medan secara rawak. Jika data medan tidak memerlukan rawak, ia akan menjadi lebih cepat.

Data direkodkan seperti berikut:

Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data

Atas ialah kandungan terperinci Cara menggunakan prosedur tersimpan Mysql untuk mencipta berjuta-juta data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam