博客
关于我
大规模数据生成 (500万条数据)
阅读量:753 次
发布时间:2019-03-23

本文共 1902 字,大约阅读时间需要 6 分钟。

最近有一个作业需要对大规模数据进行性能测试。我需要处理500万条数据,这是一个很大的量,直接通过CSV文件导入数据库显然不可行。

直接使用循环_insert会显著影响性能,效率会非常慢。想到用存储过程来实现batch插入,希望能够提升效率。

以下是存储过程的实现代码:

CREATE OR REPLACE FUNCTION insert_users_test()RETURNS void AS$BODY$DECLARE   randomsid text;   randomna_id text;   p_source text := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';   p_sourceN text := '0123456789';   p_length int := 9;   w_result text := '';   w_index int := 0;   curtime timestamp;   enttime timestamp;BEGIN   FOR i IN 1..5000000 LOOP      BEGIN         -- 生成用户ID(数字组合)         w_result := '';         w_index := 0;         p_length := 9;         FOR i IN 1..p_length LOOP            w_index := floor(random() * length(p_sourceN))::integer + 1;            w_result := w_result || substring(p_sourceN, w_index, 1);         END LOOP;         randomsid := w_result;                  -- 生成用户名(字母数字组合)         p_length := 8;         w_result := '';         w_index := 0;         FOR i IN 1..p_length LOOP            w_index := floor(random() * length(p_source))::integer + 1;            w_result := w_result || substring(p_source, w_index, 1);         END LOOP;         randomna_id := w_result;                  curtime := 'now';         enttime := curtime + '-1 hours';                  INSERT INTO user(user_id, user_name, enttime, utdate_time)                        VALUES (randomsid, randomna_id, last_login_time, curtime);      EXCEPTION WHEN unique_violation THEN         NULL;      END;   END LOOP;END;$LANGUAGE 'plpgsql';

执行命令:select insert_users_test();

这个存储过程能够有效处理大规模数据插入任务。以下是一些关键点:

  • randomsid:通过随机选择数字生成用户ID,这确保了唯一性。
  • randomna_id:通过混合字母和数字生成用户名,同样保证了唯一性。
  • FOR循环:在循环中同时生成ID和用户名,以减少外部访问数据库的次数。

这个解决方案具有以下优点:

  • 性能提升:把单次插入改为批量处理,可以显著减少时间。
  • 避免独占资源:避免了长时间占用 recounted资源,防止性能被其他查询影响。
  • 异常处理:如果ID clashes发生,存储过程会重复尝试,直到插入成功。
  • 需要注意的是,对于每批数据XOTIFY操作以及监控执行时间进行优化是很重要的。

    这个方案在设计时尽量减少了直接访问数据库的次数,同时通过随机生成数据确保了唯一性。思考充分考虑了数据库性能和数据生成的需求,是一项可行且高效的方案。

    转载地址:http://nlwzk.baihongyu.com/

    你可能感兴趣的文章
    MySQL 为什么需要两阶段提交?
    查看>>
    mysql 为某个字段的值加前缀、去掉前缀
    查看>>
    mysql 主从
    查看>>
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主从关系切换
    查看>>
    MYSQL 主从同步文档的大坑
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 事务知识点与优化建议
    查看>>
    Mysql 优化 or
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>