如何提升MySQL批量插入的效率

如何提升MySQL批量插入的效率,第1张

需要将大量数据(大概5W条)插入MySQL数

据库,用普通的SQL

Statement执行,时间大概是几分钟。于是想到用PreparedStatement,但是改了之后发现效率并没有很大的提升。不成,想到了

load data local

infile...命令,以前一直认为这条命令仅限MySQL终端上使用而不是标准的SQL语句,今天看了几篇文章之后有了很大的收获。

1. 使用PreparedStatement batch operation

以前使用PreparedStatement性能没有很大提升的原因在于:

没有使用批处理方法

在语句执行之前应关闭事务自动提交,语句执行完之后再提交

public

void batchLoad(Connection connection)

{

try

{

connection.setAutoCommit(false)

BufferedReader reader =

new BufferedReader(new

FileReader("tfacts_result"))

String sqlString =

"insert into test(node1, node2, weight) values(?, ?, ?)"

PreparedStatement pstmt = connection.prepareStatement(sqlString)

String line =

null

while(true)

{

line = reader.readLine()

if(line == null)

{

break

}

String[] columns = line.split("\t")

for(int

i = 1i <= columns.lengthi++)

{

pstmt.setString(i, columns[i-1])

}

pstmt.addBatch()

}

pstmt.executeBatch()

connection.commit()

pstmt.close()

reader.close()

}

catch (FileNotFoundException e) {

e.printStackTrace()

}catch

(SQLException e){

e.printStackTrace()

}catch

(IOException e){

e.printStackTrace()

}

2.使用load data local infile into tabel XXX(注意在文件中用\t将每列数据隔开)

public

void loadData(Connection connection)

{

long

starTime = System.currentTimeMillis()

String sqlString =

"load data local infile ? into table test"

PreparedStatement pstmt

try

{

pstmt = connection.prepareStatement(sqlString)

pstmt.setString(1,

"tfacts_result")

pstmt.executeUpdate()

pstmt.close()

}

catch (SQLException e) {

e.printStackTrace()

}

long

endTime = System.currentTimeMillis()

System.out.println("program runs "

+ (endTime - starTime) + "ms")

}

测试了5W条数据,PreparedStatement耗时10s,而load data infile耗时3s。

// mysqlTest.js

//加载mysql Module

var Client = require(‘mysql').Client,

client = new Client(),

//要创建的数据库名

TEST_DATABASE = ‘nodejs_mysql_test',

//要创建的表名

TEST_TABLE = ‘test'

//用户名

client.user = ‘root'

//密码

client.password = ‘root'

//创建连接

client.connect()

client.query(‘CREATE DATABASE ‘+TEST_DATABASE, function(err) {

if (err &&err.number != Client.ERROR_DB_CREATE_EXISTS) {

throw err

}

})

// If no callback is provided, any errors will be emitted as `'error'`

// events by the client

client.query(‘USE ‘+TEST_DATABASE)

client.query(

‘CREATE TABLE ‘+TEST_TABLE+

‘(id INT(11) AUTO_INCREMENT, ‘+

‘title VARCHAR(255), ‘+

‘text TEXT, ‘+

‘created DATETIME, ‘+

‘PRIMARY KEY (id))'

)

client.query(

‘INSERT INTO ‘+TEST_TABLE+' ‘+

‘SET title = ?, text = ?, created = ?',

['super cool', 'this is a nice text', '2010-08-16 10:00:23']

)

var query = client.query(

‘INSERT INTO ‘+TEST_TABLE+' ‘+

‘SET title = ?, text = ?, created = ?',

['another entry', 'because 2 entries make a better test', '2010-08-16 12:42:15']

)

client.query(

‘SELECT * FROM ‘+TEST_TABLE,

function selectCb(err, results, fields) {

if (err) {

throw err

}

console.log(results)

console.log(fields)

client.end()

}

)

Nodejs要连接MySQL,可以使用Nodejs的MysQL驱动来实现。比如,我们这里使用“node-mysql”连接数据库。我们使用下面的方式来连接数据库:

首先,我们需要使用nodejs的包管理工具(npm)安装mysql的驱动。命令行如下:

[plain] view plain copy

npm install musql

现在,要在js文件中使用mysql,添加下面的代码到你的文件中:

[plain] view plain copy


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/bake/7990315.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存