zoukankan      html  css  js  c++  java
  • 【MySQL】MySQL快速插入大量数据

    起源

    在公司优化SQL遇到一个索引的问题,晚上回家想继续验证,无奈没有较多数据的表,于是,想造一些随机的数据,用于验证。

    于是

    于是动手写。由于自己不是MySQL能手,写得也不好。最后,插入的速度也不快,我使用的是MySQL的InnoDB引擎,电脑跑了差不多一通宵才插入100W数据(为自己的程序汗颜)。虽然这样,我还是再次保留这份代码,以防下次要使用。嘿嘿。(插入时切换成MyISAM引擎,插入速度会快很多,插入完毕再切换回来)

    这里开始,备份我的代码

    需要插入数据的表:

    create table `t_member` (
    	`id` int (11),
    	`member_no` varchar (36),
    	`user_name` varchar (384),
    	`register_date` datetime 
    ); 
    

    生成随机数字的函数:

    DELIMITER $$
    
    USE `demo`$$
    
    DROP FUNCTION IF EXISTS `f_rand_num`$$
    
    CREATE DEFINER=`root`@`localhost` FUNCTION `f_rand_num`(
        start_num BIGINT,
        end_num BIGINT
    ) RETURNS bigint(20)
    BEGIN
        RETURN FLOOR(start_num + RAND() * (end_num - start_num + 1));
    END$$
    
    DELIMITER ;
    

    生成随机N位字符串的函数:

    DELIMITER $$
    
    USE `demo`$$
    
    DROP FUNCTION IF EXISTS `f_rand_str`$$
    
    CREATE DEFINER=`root`@`localhost` FUNCTION `f_rand_str`(l INT) RETURNS varchar(256) CHARSET utf8
    BEGIN
    	DECLARE chars_range varchar(128) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
    	DECLARE random_str varchar(256) DEFAULT '';
    	DECLARE i INT DEFAULT 0;
    	
    	WHILE i < l DO
    	    SET random_str = concat(random_str, char(ascii('a') + f_rand_num(0, 25)));
    	    SET i = i +1;
    	END WHILE;
    	
    	RETURN random_str;
        END$$
    
    DELIMITER ;
    

    插入数据的存储过程:

    DELIMITER $$
    
    USE `demo`$$
    
    DROP PROCEDURE IF EXISTS `p_make_data`$$
    
    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_make_data`(l INT)
    BEGIN
    	DECLARE i INT DEFAULT 0;
    	
    	WHILE i < l DO
    	    insert into `t_member` (`member_no`, `user_name`, `register_date`) 
    		values(f_rand_num(100000000000, 999999999999), f_rand_str(8), '2016-08-01');
    	    SET i = i + 1;
    	    
    	    IF (i % 1000 = 0) THEN
    		select @i;
    	    END IF;
    	    
    	END WHILE;
        END$$
    
    DELIMITER ;
    

    附一些测试SQL:

    -- 调用过程
    call p_make_data(500000);
    
    -- 一些测试SQL
    select f_rand_num(100000000000, 999999999999);
    select f_rand_str(8);
    select ORD('97');
    select substring('hello', 5, 1);
    select ascii('a');
    select char(97);
    select 100 % 5;
    select count(1) from t_member t order by t.`id` desc;
    

    后来的话(非常重要哦!)

    后来参考了一篇文章,它提及,转换为MyISAM引擎插入数据速度会快很多,插入完毕后再转换回来InnoDB引擎使用,另外文章中还提及了一些提高速度的小诀窍,大家可以去看:mysql快速保存插入大量数据一些方法总结

  • 相关阅读:
    Android笔记——数据库升级与降级
    Android笔记——SQLiteOpenHelper类
    Android笔记——关于Cursor类的介绍
    Android笔记——permission权限大全
    Android笔记——Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
    Android笔记——提升ListView的运行效率
    Android知识——ViewHolder的作用与用法
    Tween Animation----Rotate旋转动画
    Tween Animation----Translate位置移动动画
    Tween Animation---Scale渐变尺寸缩放动画
  • 原文地址:https://www.cnblogs.com/nick-huang/p/5781952.html
Copyright © 2011-2022 走看看