• mysql 创建存储过程 创建1000w测试数据表


    存储过程:The stored procedure

    结构

    CREATE
        [DEFINER = { user | CURRENT_USER }]
     PROCEDURE stored_procedure_name ([proc_parameter[,...]])
        [characteristic ...] routine_body
    
    proc_parameter(参数列表)
    : [ IN(输入参数) | OUT(输出参数) | INOUT(即可输入也可输出) ] param_name(参数名称) type(参数类型) characteristic(指定存储过程特性): COMMENT 'string'(注释信息) | LANGUAGE SQL(说明body部分由SQL语句组成,LANGUAGE可选值只有SQL) | [NOT] DETERMINISTIC(指明存储过程执行结果是否确定 默认值:NOT DETERMINISTIC) | { CONTAINS SQL(默认 说明子程序包含SQL语句,但是不包含写数据语句) | NO SQL(说明子程序不包含SQL语句) | READS SQL DATA(说明子程序包含读数据读数据语句) | MODIFIES SQL DATA(说明子程序包含写数据语句) }(指定子程序使用存储过程的限制) | SQL SECURITY { DEFINER(默认 只有定义者才能执行) | INVOKER(拥有权限的调用者才可以执行) }(指明谁有权限执行)
    
    routine_body(SQL代码内容,可以使用BEGIN...END表示SQL代码的开始和结束):
      Valid SQL routine statement
    
    [begin_label:] BEGIN
      [statement_list]
        ……
    END [end_label]

    例子

    #无参数
    create procedure myFist_proc() ## 创建存储过程
    begin 
         //....
    end;
    
    show create procedure myFist_proc();
    call myFist_proc();
    
    
    #带有输出参数的存储过程
    create procedure mySecond_proc(out sumStudent int )
    begin 
        select count(*) into sumStudent from score where grade>80;
    end;
    
    call mySecond_proc(@sumStudent);
    select @sumStudent;
    
    
    ##带有输入参数的存储过程
    
    create procedure myThird_proc(in minScore int ,out sumStudent int)# 创建存储过程
    begin 
        select count(*) into new_table_name  from old_table_name where grade>minScore;#从一个旧表中选取数据,然后把数据插入另一个新表中 
    end;
    
    call myThird_proc(90); #大于90的
    select @sumStudent;
    View Code

    创建1000万数据的测试表(电脑问题非常慢)    

    #创建表
    CREATE TABLE `big_data_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(16) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      `email` varchar(64) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`),
      KEY `name_age` (`email`,`age`) USING BTREE,
      KEY `email` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    #创建存储过程,开始插入数据
    CREATE PROCEDURE `insert_data_p`(IN num INT)
    BEGIN
    DECLARE n INT DEFAULT 1;#申明变量n
    WHILE n <= num DO       #当n小于传入的参数时执行循环插入
    INSERT INTO big_data_test(name,age,email)values(concat('alex',n),rand()*50,concat('alex',n,'@qq.com'));
    set n=n+1;
    end while;
    ENd; 
    
    #调用存储过程,插入1000万条数据(总耗时:382.614 sec)
    CALL insert_data_p(10000000);

     这个超快  MySQL快速生成100W条测试数据转载连接

    CREATE TABLE `vote_record` (
        `id` INT (11) NOT NULL AUTO_INCREMENT,
        `user_id` VARCHAR (20) NOT NULL,
        `vote_id` INT (11) NOT NULL,
        `group_id` INT (11) NOT NULL,
        `create_time` datetime NOT NULL,
        PRIMARY KEY (`id`),
        KEY `index_user_id` (`user_id`) USING HASH
    ) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
    
    
    #内存表
    CREATE TABLE `vote_record_memory` (
        `id` INT (11) NOT NULL AUTO_INCREMENT,
        `user_id` VARCHAR (20) NOT NULL,
        `vote_id` INT (11) NOT NULL,
        `group_id` INT (11) NOT NULL,
        `create_time` datetime NOT NULL,
        PRIMARY KEY (`id`),
        KEY `index_id` (`user_id`) USING HASH
    ) ENGINE = MEMORY AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
    
    #创建函数及存储过程
    CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1
    BEGIN 
    DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 
    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()*62 ),1)); 
    SET i = i +1; 
    END WHILE; 
    RETURN return_str; 
    END;
    
    
    CREATE  PROCEDURE `add_vote_memory`(IN n int)
    BEGIN  
      DECLARE i INT DEFAULT 1;
        WHILE (i <= n ) DO
          INSERT into vote_record_memory  (user_id,vote_id,group_id,create_time ) VALUEs (rand_string(20),FLOOR(RAND() * 1000),FLOOR(RAND() * 100) ,now() );
                set i=i+1;
        END WHILE;
    END;
    
    #插入内存表
    CALL add_vote_memory(1000000)
    
    #插入普通表中
    INSERT into vote_record SELECT * from  vote_record_memory
    
    
    
    #php.ini改下内存
      tmp_table_size=1G
      max_heap_table_size = 1G

    或者动态设置
    SET GLOBAL tmp_table_size=2147483648; (无效果?)
    SET GLOBAL max_heap_table_size=2147483648;(无效果?)
    或者:
    set session tmp_table_size=1024*1024*1024; (查看:show variables like '%tmp_table%';)
    set session max_heap_table_size=1024*1024*1024; (查看:show variables like '%max_heap%';)
    tmp_table_size 控制内存临时表的最大值,超过限值后就往硬盘写,写的位置由变量 tmpdir 决定 
    max_heap_table_size 用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。
    查看:show variables like '%tmp%';
    max_tmp_tables=32 #客户端可以同时保持打开的最大临时表数
    E
    RROR 1114 (HY000): The table 'vote_record_memory' is full 就是因为上面的值设置的太小
  • 相关阅读:
    熬夜到凌晨2点半

    浏览器F12,Network中各按钮的作用
    postman收藏 -大佬玩法。
    Windows日常快捷键
    认识jmeter(一)
    web测试:test过程中接口报错 "Object reference not set to an instance of an object."
    postman-error:SyntaxError: Invalid shorthand property initializer
    mysql 表结构及基本操作
    getinstance方法(转)
  • 原文地址:https://www.cnblogs.com/lichihua/p/10693243.html
Copyright © 2020-2023  润新知