mysql利用存储过程批量插入数据

最近需要测试一下mysql单表数据达到1000W条以上时增删改查的性能。由于没有现成的数据,因此自己构造,本文只是实例,以及简单的介绍。

首先当然是建表:

CREATE TABLE `fortest` (
  `ID` INT(30) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `IP` VARCHAR(32) NOT NULL,
  `OID` VARCHAR(15) DEFAULT NULL)

其次,构建存储过程:

DELIMITER $$

USE `插入表所在的数据库名字`$$

DROP PROCEDURE IF EXISTS `autoinsert`$$

CREATE DEFINER=`root`@`192.168.137.10` PROCEDURE `autoinsert`(IN IP_NUM INT, IN OID_NUM INT)
BEGIN
  DECLARE iIP INT DEFAULT 0 ;
  DECLARE iOID INT DEFAULT 0 ;
   WHILE(iIP < IP_NUM)
    DO
      SET iOID = 0;
      WHILE(iOID<OID_NUM)
      DO
        SET @mySql=CONCAT("INSERT INTO fortest (IP, OID) VALUES(CONCAT((ROUND(RAND() * 255) + 1),'.',(ROUND(RAND() * 255) + 1),'.',(ROUND(RAND() * 255) + 1),'.',(ROUND(RAND() * 255) + 1)),ROUND(RAND()*100)+1);");
        PREPARE stmt FROM @mySql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET iIP = iIP+1;
      END WHILE;
        SET iPC = iPC+1;
    END WHILE;

    END$$

DELIMITER ;

上述存储过程指定了两个输入参数:IP_NUM  OID_NUM,两个参数分别指定了有多少台机器,以及每台机器有多少OID。

之后调用存储过程就可以了:

call autoinsert 1000 50

意思是,有100台机器,每个机器有50个参数。

这样,我们就构建了50000条数据,如果按上述存储过程,想达到1000W的数据,还是要花点时间的。可以采用如下方法,进一步提高速度:

首先创建具有同样表结构的表:

CREATE TABLE fortest_2 LIKE fortest;

然后根据fortest表插入5W条数据

INSERT INTOfortest_2(IP,OID) SELECT IP,ROUND(RAND() * 100) + 1) FROM fortest;

上述一条语句执行速度特别快,瞬间就插入了5W条数据。可以写个脚本执行:

#!/bin/bash

i=1;
MAX_INSERT_ROW_COUNT=$1;
j=0;
while [ $i -le $MAX_INSERT_ROW_COUNT ]
do
    time mysql -h192.168.137.1 -uroot -p123456 fortest -e "INSERT INTOfortest_2(IP,OID) SELECT IP,ROUND(RAND() * 100) + 1) FROM fortest;"
    echo "INSERT $i "
    i=$(($i+1))
#    sleep 0.05
done

exit 0
时间: 2024-09-30 04:57:46

mysql利用存储过程批量插入数据的相关文章

postgres 使用存储过程批量插入数据

参考资料(pl/pgsql 官方文档): http://www.postgresql.org/docs/9.3/static/plpgsql.html create or replace function creatData2() returns boolean AS $BODY$ declare ii integer; begin II:=1; FOR ii IN 1..10000000 LOOP INSERT INTO ipm_model_history_data (res_model, r

sqlserver存储过程批量插入数据

在系统中经常会遇到向数据库中批量插入数据情况,存储过程中没有数组,只有通过字符串分割循环插入,下面是一个本人研究的一个例子: create proc [dbo].[Proc_TestBatchMainDetailIns] @mainName nvarchar(50),@detailNameStr nvarchar(max),@detailAgeStr nvarchar(max), @detailRowCount int=1,@tmpFlag int=1,@newMainId int=0 as b

mysql利用sql脚本插入数据中文乱码

将其中的 /*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */;/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */;/*!40101 SET @[email protected]@COLLATION_CONNECTION */;/*!40101 SET NAMES gbk */;和末尾的 /*!40101 SET @[email protected]@CHARACTER_SET

mysql命令行批量插入100条数据命令

先介绍一个关键字的使用: delimiter 定好结束符为"$$",(定义的时候需要加上一个空格) 然后最后又定义为";", MYSQL的默认结束符为";" 如何通过mysql命令行批量插入100条数据呢,可以在代码里实现,也可以通过命令行,也就是通过存储过程: delimiter $$create procedure myproc ()begindeclare num int ;set num = 1 ;while num < 100 d

向mysql中批量插入数据的性能分析

MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 50 ) NOT NULL,value VARCHAR( 50 ) NOT NULL,other_value VARCHAR( 50 ) NOT NULL) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example(example_id, name, valu

将list&lt;对象&gt;转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其他的方法,不过这个方法已经实现,就写一下了: 1.创建表. CREATE TABLE [dbo].[person]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Pwd] [nvarchar](50) NULL, [Age]

mysql批量插入数据

review代码发现,同事mysql批量插入数据的实现方法是,用for循环遍历,将列表每个数据单次插入.相当于批量插入N条数据,进行了n次的数据库连接和插入操作. 底层有批量插入的方法,但是会有问题,所以已经停用,看下面实现是,取到一个数据库连接,来处理后面所有的插入操作.若这个列表ops所有的sql语句执行的数据库都是同一个的话,就没什么问题,若里面存在散库的情况,只要跟第一个不在同一个库的,都会执行失败. public void insertBatch(List<OpBatchUpdate>

使用存储过程向数据库批量插入数据

<一> 前言 最近有个需求,需要向数据库并发批量插入数据. 最开始使用存储过程,类似这样的:  delimiter //   CREATE PROCEDURE load_part_tab()  begin      declare v int default 0;      while v < 8000000      do          insert into part_tab          values (v,'testing partitions',adddate('199

MySQL批量插入数据的几种方法

最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; public class TestBigData { /**