
据库,用普通的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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)