mysql 用存储过程插入数据 一个小时才插入了10w条怎么那么慢啊

开源中国技术顾问 发布于 2015/06/26 16:15
阅读 3K+
收藏 0
PROCEDURE test.insert_test ()
BEGIN
SET @a=1000000;
WHILE @a>0 DO
SET @b='beijing';
SET @c='nan';
INSERT INTO test.student(name, address, sex)
VALUES(@a, @b, @c);
SET @a=@a-1;
END WHILE;
END



存储过程如上
加载中
0
cherrypp
cherrypp

1. 批量插入是正途。

2. 先用存储去快速创建一个临时表,把所有数据插入,然后再通过这个分区表把数据导入现在的表。这和删除索引和约束是一个道理。这个方法更好点。

0
梦想岛
梦想岛
mysql> set sql_mode=''; /* 如果创建存储过程失败,则先需设置此变量, bug? */
mysql> delimiter //   /* 设定语句终结符为 //,因存储过程语句用;结束 */
mysql> CREATE PROCEDURE load_part_tab()
       begin
    declare v int default 0;
    while v < 8000000
    do
        insert into part_tab
        values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));
         set v = v + 1;
    end while;
    end
    //
mysql> delimiter ;
mysql> call load_part_tab();
Query OK, 1 row affected (8 min 17.75 sec)
mysql> insert into no_part_tab select * from part_tab;
Query OK, 8000000 rows affected (51.59 sec)
Records: 8000000 Duplicates: 0 Warnings: 0


我网上找来的,你可以试试 800万条

开源中国技术顾问
开源中国技术顾问
我看这个存储过程和我的比也没啥区别呀 我也是直接call的却很慢
0
薛定谔的猫v
薛定谔的猫v
优化方案:1.去掉索引。插入完毕再重新添加。2.不要一条数据一个insert,全部跟在value后面拼接完成了再执行。
我爱我的妻
这个靠谱,拼接起来插入,比每次都去差快的不是一星半点,2,30w条数据,几秒钟搞定 ----新浪微博:@最美最好的你
0
幽烛
幽烛
不要单插,要批量插
0
pillsilly
pillsilly

1.把所有sql写入到文本中,java中调用命令行load file,这样是最快的

2.楼上的插入后再建索引也是对的

3.最后,根据你的实际使用需求,选择是否用MyISAM做存储结构(按照你当前的插入效率,应该是InnoDB不会有错)

0
itkang
itkang
插入之前,把所有的约束,所有的索引,全部干掉,可以批量插入,但是批量插入有数量限制
返回顶部
顶部