mysql(表:InnoDB,无索引),批量插入50万条记录后,越来越慢。

问题描述

mysql(表:InnoDB,无索引),批量插入50万条记录后,越来越慢。

插入10000条,已用时0秒
插入20000条,已用时2秒
插入30000条,已用时3秒
插入40000条,已用时3秒
插入50000条,已用时4秒
插入60000条,已用时5秒
插入70000条,已用时6秒
插入80000条,已用时7秒
插入90000条,已用时8秒
插入100000条,已用时9秒
插入110000条,已用时11秒
插入120000条,已用时12秒
插入130000条,已用时13秒
插入140000条,已用时14秒
插入150000条,已用时15秒
插入160000条,已用时16秒
插入170000条,已用时17秒
插入180000条,已用时18秒
插入190000条,已用时19秒
插入200000条,已用时21秒
插入210000条,已用时22秒
插入220000条,已用时23秒
插入230000条,已用时25秒
插入240000条,已用时26秒
插入250000条,已用时27秒
插入260000条,已用时28秒
插入270000条,已用时30秒
插入280000条,已用时31秒
插入290000条,已用时32秒
插入300000条,已用时33秒
插入310000条,已用时34秒
插入320000条,已用时36秒
插入330000条,已用时37秒
插入340000条,已用时38秒
插入350000条,已用时39秒
插入360000条,已用时41秒
插入370000条,已用时42秒
插入380000条,已用时43秒
插入390000条,已用时44秒
插入400000条,已用时45秒
插入410000条,已用时46秒
插入420000条,已用时48秒
插入430000条,已用时49秒
插入440000条,已用时50秒
插入450000条,已用时52秒
插入460000条,已用时57秒
插入470000条,已用时66秒
插入480000条,已用时76秒
插入490000条,已用时90秒
插入500000条,已用时105秒
插入510000条,已用时123秒
插入520000条,已用时142秒
插入530000条,已用时164秒
插入540000条,已用时187秒
插入550000条,已用时212秒
插入560000条,已用时239秒
插入570000条,已用时266秒
插入580000条,已用时294秒
插入590000条,已用时323秒
插入600000条,已用时358秒
插入610000条,已用时389秒
插入620000条,已用时421秒
插入630000条,已用时458秒
插入640000条,已用时496秒

停止程序,再次运行,一万条需几十秒。
清空该表,重新运行,很快。在将近插入50万条记录时,一万条需几十秒。

public static void main(String[] args) {
    PreparedStatement pstmt = null;
    Connection conn = null;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/pis";
        String username = "root";
        String password = "root";
        conn = DriverManager.getConnection(url, username, password);

        conn.setAutoCommit(false);

        String sql = "SELECT T.ID FROM PIS_PERSON_EX T WHERE T.NAME LIKE 'TEST%'";
        PreparedStatement statement = conn.prepareStatement(sql);
        ResultSet result = statement.executeQuery();

        String sql2 = "INSERT INTO PIS_RECORD (ID, RCTIMES, RCTIMEP, YEARS, MONTHS, DAYS, YMD, PERSONID, DEVICEID, NOTESTR) "
                + " VALUES (?,?,?,?,?,?,?,?,?,?)";
        pstmt = conn.prepareStatement(sql2);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        Random random = new Random();
        int pos = 0;
        Date t1 = new Date();
        while (result.next()) {
            for (int i = 1; i <= 31; i++) {
                String day = i + "";
                if (i < 10) {
                    day = "0" + i;
                }

                for(int j = 0; j < 5; j++){
                    Date checkStartTime = new Date(
                            sdf.parse("201601" + day + "090000").getTime() - (random.nextInt(21600000) - 10800000));
                    Date checkEndTime = new Date(
                            sdf.parse("201601" + day + "180000").getTime() - (random.nextInt(21600000) - 10800000));
                    String checkStartTimeStr = sdf.format(checkStartTime);
                    String checkEndTimeStr = sdf.format(checkEndTime);

                    pstmt.setString(1, UUID.randomUUID().toString().replaceAll("-", ""));
                    pstmt.setString(2, checkStartTimeStr);
                    pstmt.setTimestamp(3, new Timestamp(checkStartTime.getTime()));
                    pstmt.setString(4, checkStartTimeStr.substring(0, 4));
                    pstmt.setString(5, checkStartTimeStr.substring(4, 6));
                    pstmt.setString(6, checkStartTimeStr.substring(6, 8));
                    pstmt.setString(7, checkStartTimeStr.substring(0, 8));
                    pstmt.setString(8, result.getString(1));
                    pstmt.setString(9, "402888634f5d7f28014f62f346af1268");
                    pstmt.setString(10, "NONE");
                    pos++;
                    pstmt.addBatch();

                    pstmt.setString(1, UUID.randomUUID().toString().replaceAll("-", ""));
                    pstmt.setString(2, checkEndTimeStr);
                    pstmt.setTimestamp(3, new Timestamp(checkEndTime.getTime()));
                    pstmt.setString(4, checkEndTimeStr.substring(0, 4));
                    pstmt.setString(5, checkEndTimeStr.substring(4, 6));
                    pstmt.setString(6, checkEndTimeStr.substring(6, 8));
                    pstmt.setString(7, checkEndTimeStr.substring(0, 8));
                    pstmt.setString(8, result.getString(1));
                    pstmt.setString(9, "402888634f5d7f28014f62f346af1268");
                    pstmt.setString(10, "NONE");
                    pos++;
                    pstmt.addBatch();

                    if (pos % 10000 == 0) {
                        long sj = (new Date().getTime() - t1.getTime()) / 1000;
                        pstmt.executeBatch();
                        conn.commit();
                        System.out.println("插入" + pos + "条,已用时"+sj+"秒");
                    }
                }
            }
        }

        pstmt.executeBatch();
        conn.commit();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

解决方案

解决,把主键的uuid改成字符串的1,2,3.。。。就正常了。
插入10000条,已用时0秒
插入20000条,已用时1秒
插入30000条,已用时2秒
插入40000条,已用时3秒
插入50000条,已用时4秒
插入60000条,已用时5秒
插入70000条,已用时6秒
插入80000条,已用时7秒
插入90000条,已用时7秒
插入100000条,已用时8秒
插入110000条,已用时9秒
插入120000条,已用时10秒
插入130000条,已用时11秒
插入140000条,已用时12秒
插入150000条,已用时13秒
插入160000条,已用时14秒
插入170000条,已用时14秒
插入180000条,已用时15秒
插入190000条,已用时16秒
插入200000条,已用时17秒
插入210000条,已用时18秒
插入220000条,已用时19秒
插入230000条,已用时20秒
插入240000条,已用时21秒
插入250000条,已用时21秒
插入260000条,已用时22秒
插入270000条,已用时23秒
插入280000条,已用时24秒
插入290000条,已用时25秒
插入300000条,已用时26秒
插入310000条,已用时27秒
插入320000条,已用时28秒
插入330000条,已用时28秒
插入340000条,已用时29秒
插入350000条,已用时30秒
插入360000条,已用时31秒
插入370000条,已用时32秒
插入380000条,已用时33秒
插入390000条,已用时34秒
插入400000条,已用时34秒
插入410000条,已用时35秒
插入420000条,已用时36秒
插入430000条,已用时37秒
插入440000条,已用时38秒
插入450000条,已用时40秒
插入460000条,已用时41秒
插入470000条,已用时42秒
插入480000条,已用时43秒
插入490000条,已用时44秒
插入500000条,已用时45秒
插入510000条,已用时46秒
插入520000条,已用时47秒
插入530000条,已用时48秒
插入540000条,已用时49秒
插入550000条,已用时50秒
插入560000条,已用时51秒
插入570000条,已用时52秒
插入580000条,已用时53秒
插入590000条,已用时54秒
插入600000条,已用时55秒
插入610000条,已用时56秒
插入620000条,已用时57秒
插入630000条,已用时58秒
插入640000条,已用时59秒
插入650000条,已用时60秒
插入660000条,已用时61秒
插入670000条,已用时62秒
插入680000条,已用时63秒
插入690000条,已用时64秒
插入700000条,已用时65秒
插入710000条,已用时66秒
插入720000条,已用时67秒
插入730000条,已用时68秒
插入740000条,已用时69秒
插入750000条,已用时70秒
插入760000条,已用时71秒
插入770000条,已用时73秒
插入780000条,已用时74秒
插入790000条,已用时75秒
插入800000条,已用时76秒
插入810000条,已用时77秒
插入820000条,已用时78秒
插入830000条,已用时80秒
插入840000条,已用时81秒
插入850000条,已用时82秒
插入860000条,已用时83秒
插入870000条,已用时84秒
插入880000条,已用时85秒
插入890000条,已用时86秒
插入900000条,已用时87秒
插入910000条,已用时88秒
插入920000条,已用时90秒
插入930000条,已用时91秒
插入940000条,已用时92秒
插入950000条,已用时93秒
插入960000条,已用时94秒
插入970000条,已用时95秒
插入980000条,已用时97秒
插入990000条,已用时98秒
插入1000000条,已用时99秒
插入1010000条,已用时100秒
插入1020000条,已用时101秒
插入1030000条,已用时102秒
插入1040000条,已用时104秒
插入1050000条,已用时105秒
插入1060000条,已用时106秒
插入1070000条,已用时107秒
插入1080000条,已用时108秒
插入1090000条,已用时110秒
插入1100000条,已用时111秒
插入1110000条,已用时113秒
插入1120000条,已用时114秒
插入1130000条,已用时116秒
插入1140000条,已用时117秒
插入1150000条,已用时118秒
插入1160000条,已用时119秒
插入1170000条,已用时121秒
插入1180000条,已用时122秒
插入1190000条,已用时123秒
插入1200000条,已用时124秒
插入1210000条,已用时125秒
插入1220000条,已用时126秒
插入1230000条,已用时128秒
插入1240000条,已用时129秒
插入1250000条,已用时130秒
插入1260000条,已用时131秒
插入1270000条,已用时133秒
插入1280000条,已用时134秒
插入1290000条,已用时135秒
插入1300000条,已用时136秒
插入1310000条,已用时138秒
插入1320000条,已用时139秒
插入1330000条,已用时140秒
插入1340000条,已用时141秒
插入1350000条,已用时143秒
插入1360000条,已用时144秒
插入1370000条,已用时145秒
插入1380000条,已用时146秒
插入1390000条,已用时148秒
插入1400000条,已用时149秒
插入1410000条,已用时150秒
插入1420000条,已用时151秒
插入1430000条,已用时153秒
插入1440000条,已用时154秒
插入1450000条,已用时155秒
插入1460000条,已用时157秒
插入1470000条,已用时158秒
插入1480000条,已用时159秒
插入1490000条,已用时160秒
插入1500000条,已用时161秒
插入1510000条,已用时163秒
插入1520000条,已用时164秒
插入1530000条,已用时165秒
插入1540000条,已用时166秒
插入1550000条,已用时168秒
插入1560000条,已用时169秒
插入1570000条,已用时170秒
插入1580000条,已用时171秒
插入1590000条,已用时172秒
插入1600000条,已用时173秒
插入1610000条,已用时175秒
插入1620000条,已用时176秒
插入1630000条,已用时178秒
插入1640000条,已用时179秒
插入1650000条,已用时180秒
插入1660000条,已用时182秒
插入1670000条,已用时183秒
插入1680000条,已用时184秒
插入1690000条,已用时185秒
插入1700000条,已用时186秒
插入1710000条,已用时188秒
插入1720000条,已用时189秒
插入1730000条,已用时190秒
插入1740000条,已用时192秒
插入1750000条,已用时193秒
插入1760000条,已用时194秒
插入1770000条,已用时195秒
插入1780000条,已用时197秒
插入1790000条,已用时198秒
插入1800000条,已用时199秒
插入1810000条,已用时201秒
插入1820000条,已用时202秒
插入1830000条,已用时203秒
插入1840000条,已用时205秒
插入1850000条,已用时206秒
插入1860000条,已用时207秒
插入1870000条,已用时209秒
插入1880000条,已用时210秒
插入1890000条,已用时211秒
插入1900000条,已用时212秒
插入1910000条,已用时213秒
插入1920000条,已用时215秒
插入1930000条,已用时216秒
插入1940000条,已用时217秒
插入1950000条,已用时218秒
插入1960000条,已用时220秒
插入1970000条,已用时221秒
插入1980000条,已用时222秒
插入1990000条,已用时223秒
插入2000000条,已用时225秒
插入2010000条,已用时226秒
插入2020000条,已用时227秒
插入2030000条,已用时228秒
插入2040000条,已用时229秒
插入2050000条,已用时230秒
插入2060000条,已用时231秒
插入2070000条,已用时233秒
插入2080000条,已用时234秒
插入2090000条,已用时236秒
插入2100000条,已用时237秒
插入2110000条,已用时238秒
插入2120000条,已用时239秒
插入2130000条,已用时241秒
插入2140000条,已用时242秒
插入2150000条,已用时243秒
插入2160000条,已用时244秒
插入2170000条,已用时246秒
插入2180000条,已用时247秒
插入2190000条,已用时249秒
插入2200000条,已用时250秒
插入2210000条,已用时251秒
插入2220000条,已用时253秒
插入2230000条,已用时254秒
插入2240000条,已用时255秒
插入2250000条,已用时256秒
插入2260000条,已用时258秒
插入2270000条,已用时259秒
插入2280000条,已用时261秒
插入2290000条,已用时263秒
插入2300000条,已用时265秒
插入2310000条,已用时266秒
插入2320000条,已用时267秒
插入2330000条,已用时268秒
插入2340000条,已用时269秒
插入2350000条,已用时270秒
插入2360000条,已用时271秒
插入2370000条,已用时272秒
插入2380000条,已用时273秒
插入2390000条,已用时275秒
插入2400000条,已用时276秒
插入2410000条,已用时277秒
插入2420000条,已用时279秒
插入2430000条,已用时280秒
插入2440000条,已用时281秒
插入2450000条,已用时282秒
插入2460000条,已用时283秒
插入2470000条,已用时284秒
插入2480000条,已用时285秒
插入2490000条,已用时286秒
插入2500000条,已用时288秒
插入2510000条,已用时289秒
插入2520000条,已用时290秒
插入2530000条,已用时292秒
插入2540000条,已用时293秒
插入2550000条,已用时294秒
插入2560000条,已用时295秒
插入2570000条,已用时296秒
插入2580000条,已用时298秒
插入2590000条,已用时299秒
插入2600000条,已用时300秒
插入2610000条,已用时301秒
插入2620000条,已用时302秒
插入2630000条,已用时304秒
插入2640000条,已用时305秒
插入2650000条,已用时306秒
插入2660000条,已用时308秒
插入2670000条,已用时309秒
插入2680000条,已用时310秒
插入2690000条,已用时311秒
插入2700000条,已用时313秒
插入2710000条,已用时314秒
插入2720000条,已用时315秒
插入2730000条,已用时316秒
插入2740000条,已用时317秒
插入2750000条,已用时319秒
插入2760000条,已用时320秒
插入2770000条,已用时321秒
插入2780000条,已用时322秒
插入2790000条,已用时324秒
插入2800000条,已用时325秒
插入2810000条,已用时326秒
插入2820000条,已用时327秒
插入2830000条,已用时329秒
插入2840000条,已用时330秒
插入2850000条,已用时331秒
插入2860000条,已用时332秒
插入2870000条,已用时334秒
插入2880000条,已用时335秒
插入2890000条,已用时336秒
插入2900000条,已用时337秒
插入2910000条,已用时339秒
插入2920000条,已用时340秒
插入2930000条,已用时341秒
插入2940000条,已用时342秒
插入2950000条,已用时343秒
插入2960000条,已用时344秒
插入2970000条,已用时345秒
插入2980000条,已用时347秒
插入2990000条,已用时348秒
插入3000000条,已用时349秒
插入3010000条,已用时351秒
插入3020000条,已用时352秒
插入3030000条,已用时353秒
插入3040000条,已用时355秒
插入3050000条,已用时356秒
插入3060000条,已用时358秒
插入3070000条,已用时359秒
插入3080000条,已用时360秒
插入3090000条,已用时361秒
插入3100000条,已用时362秒

解决方案二:

检查主键、外键、唯一索引、触发器等。

解决方案三:

不过最好先看下目前消耗的是cpu内存还是io,然后才好判断。

解决方案四:

用explain等查看一下性能瓶颈 是不是数据进去跟已有数据有联系 导致越来越慢

时间: 2024-09-08 13:08:50

mysql(表:InnoDB,无索引),批量插入50万条记录后,越来越慢。的相关文章

sql server 2000中循环插入100万条数据

server|插入|数据|循环 出处:∮明天去要饭's Blog         前段时间在测试100万条以上数据时的分页速度,需要往数据库中插入100万条记录,那个时候插入记录我是用C#写的,后来发现,其实用SQL自已也可以实现的,而且更简单哦!以下是我写的一个实例,很简单,大家应该能看懂的.         declare @i int  --变义变量@i        set @i = 1 --初始化@i为1        while @i < 100 --如果@i小于100,这里改成10

3分钟如何向MySQL数据库中插入100万条数据

一.编写测试案例向MySQL数据库中插入百万条数据.测试数据表建表脚本如下:use db_xk; drop table if exists tb_test2; create table tb_test2 ( id int primary key auto_increment, subject varchar(50) not null, description varchar(200) not null, teacher_id int(10) zerofill not null, student_

SQL2008使用CTE递归查询批量插入500万数据

原文 http://www.cnblogs.com/wjmo520/archive/2013/04/27/3046795.html 一直都使用一般的批量循环插入方法 ,可这效率也太慢了,插入500万条数据执行所需的时间远远超过10分钟.于是度娘了一下 发现可以使用CTE进行递归循环插入 以下是亲测的数据: 1.创建表: CREATE TABLE Customers (CustomerID INT primary key identity(1,1), CustomerNumber CHAR(4),

mysql 插入10万条数据 优化效率

问题描述 mysql 插入10万条数据 优化效率 public int addTypes(List<taobaoBean> babyList) { String sql = "insert into type (typeid,url) values (?,?) "; Connection conn = dbhelper.getConnection(driver,url,username,upwd); int result = 0; PreparedStatement stm

MYSQL 中怎样把同一张表中相同字段的内容合并为一条记录?

问题描述 MYSQL 中怎样把同一张表中相同字段的内容合并为一条记录? 我的表现在是这样的: 客户id 购买产品id 1 123 1 124 1 125 1 126 2 168 2 169 想让表转变成: 客户id 购买产品id 1 123,124,125,126 2 168,169 也就是说把一个客户购买的产品合并显示在一条记录中. 解决方案 使用group_concat 解决方案二: 用行转列实现,今天上午看到一个和你的问题完全符合 http://blog.csdn.net/ning1093

现在有1500万条数据,想从中随机抽取50万条,采用什么方式比较快捷?

问题描述 现在有1500万条数据,想从中随机抽取50万条,采用什么方式比较快捷? 现在有1500万条数据,想从中随机抽取50万条,采用什么方式比较快捷.数据是存储在mysql里的. 解决方案 额,试试随机生成Where条件来做 解决方案二: SELECT * FROM table_name ORDER BY RAND() limit 500000 解决方案三: 随机获取索引,limit 会连续取值,不会随机 解决方案四: 随机获取索引,limit 会连续取值,不会随机 解决方案五: ORDER

mysql使用GROUP BY分组实现取前N条记录的方法_Mysql

本文实例讲述了mysql使用GROUP BY分组实现取前N条记录的方法.分享给大家供大家参考,具体如下: MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: 复制代码 代码如下: SELECT a.id,a.SName,a.ClsNo,a.Score FROM aa a LEFT J

oracle数据库中怎么一次性插入10万条数据

问题描述 oracle数据库中怎么一次性插入10万条数据 oracle数据库中怎么一次性插入10万条数据?急用!!!1 解决方案 最快的方法是用imp进行导入 或者用sql执行也可以(insert into )

平台终端吞吐量每秒达到2万设备,每秒插入2万条数据技术方案

问题描述 平台终端吞吐量每秒达到2万设备,每秒插入2万条数据技术方案 5C 目前由于平台要处理2万设备,每秒能处理2万条数据,之前使用ActiveMQ,不能达到需求了,之前测试rabbitMQ,Redis 之类,在测试机子上面都不能达到需求,本地测试 模拟1000个线程并发处理,一个线程处理1000插入数据,始终未能达到!不知道大家有没什么好的解决方案能达到这种需求的? 解决方案 单机很难达到这样的吞吐量,需要使用负载平衡了. 解决方案二: 同多台机器分布式处理吧. 解决方案三: hadoop等