2 qq1247 qq1247 于 2016.01.21 20:03 提问

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();
            }
        }
    }
}

5个回答

qq1247
qq1247   2016.01.22 15:51
已采纳

解决,把主键的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秒

caozhy
caozhy   Ds   Rxr 2016.01.21 20:06

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

qq1247
qq1247 无外键,无索引,无触发器
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.01.21 20:07

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

oyljerry
oyljerry   Ds   Rxr 2016.01.21 21:05

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

qq1247
qq1247 插入不能用explain查看吧。
接近 2 年之前 回复
qq1247
qq1247 插入不能用explain查看吧。
接近 2 年之前 回复
mu0003
mu0003   2017.03.30 15:29

原因分析一下吧,开始使用uuid作为主键,由于生成的uuid是无序的。写入数据库的时候引起page分裂,数量越大分裂的可能性就越大,分裂时需要搬动的数据库就越多。所以会越来越慢。后来把uuid变成1、2、3这样的字符窜,数据是有序地写入,不会引起page的分裂,不存在数据的搬动,所以可以保持速度很快。这和innodb的存储引擎特性有关。建议直接使用自增主键。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!