使用节点JavaScript将批量数据插入MySQL

使用节点JavaScript将批量数据插入MySQL,mysql,node.js,node-mysql,Mysql,Node.js,Node Mysql,我正在尝试从SQLServer获取数据并插入MySQL。我有大约1个lac的记录。记录的获取是正确的,但在将记录插入MySQL的过程中,不会立即插入数据。我需要刷新MySQL以查看新记录 var sql = require('mssql'); var mysql = require("mysql"); var config = { user : 'sa', password : '******', server : 'serverurl

我正在尝试从SQLServer获取数据并插入MySQL。我有大约1个lac的记录。记录的获取是正确的,但在将记录插入MySQL的过程中,不会立即插入数据。我需要刷新MySQL以查看新记录

var sql       = require('mssql');
var mysql     = require("mysql");

var config = {
    user     : 'sa', 
    password : '******',
    server   : 'serverurl', 
    database : 'DB',
    stream   : true //work with large amount of rows
};

var connection1 = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'root',
    database : 'test'
});

connection1.connect();

var connection = new sql.Connection(config, function(err) {

    if(err)
        console.log(err);

    var request = new sql.Request(connection);
    // request.stream = true; // You can set streaming differently for each request 

    request.query('select TOP 100000 * FROM ShipmentAuditLog WITH (NOLOCK)'); // or request.execute(procedure); 


    request.on('recordset',function(col){
        console.time('Time-Taken');
    });

    // Emitted for each row 
    request.on('row', function(row) {

        syncing(row);
        // console.log('Row Inserted');

    });

    request.on('error', function(err) {
        console.log(err);
    });

    // Emitted for the last one
    request.on('done', function(returnValue) {
        console.timeEnd('Time-Taken');
        connection.close();
    });
});

var syncing = function(row){
    connection1.query('INSERT INTO shipmentauditlog SET ?', row, function(err,res) {

        if(err)
            console.log(err);
        // else
            // console.log('Added');

     });
 };

当我试图将数千条假记录插入MySQL数据库时,我也成功地再现了同样的效果。这显然会使日志过载(因为ACID符合性),因此您有两个选择—要么在插入期间放松ACID符合性(请参阅),尽管这通常是一个非常糟糕的主意;要么更好的解决方案是使用NodeJS成批插入记录,而不是逐个插入记录

我的建议是,根据记录的大小,一次读取20或30条记录,然后构建一个multi-insert将数据添加到MySQL。看

所以你最终会做这样的事情:

'INSERT INTO shipmentauditlog VALUES (1,2,3), (1,2,3), (1,1,1), (1,1,3);'
如果这是一次大规模操作,另一种选择是使用NodeJS读取所有记录,并创建一个包含所有数据的TXT文档。MySQL非常支持批量加载大量数据。这将要快得多,因为MySQL将分批从文件中读取数据,并在执行过程中插入数据。如果我必须加载大量数据,这将是我的首选选项。有关详细信息,请参阅

一个简单的例子是:

LOAD DATA INFILE 'mydata.txt' INTO TABLE shipmentauditlog 
FIELDS TERMINATED BY ',';

您可能需要执行提交,这不是关系数据库的事情吗?我已经有一段时间没有这样做了,但我想我以前也有过类似的事情。@Ewald:-数据存储在mysql中,但问题是,它一次也没有存储数据。我很困惑,数据在mysql中,但它不是立即存在的,这可能是因为它发生的速度比mysql提交到磁盘的频率要快,所以它仍然在日志中,正在处理中?这就是问题所在吗?@Ewald是的,你是对的,我会试试你的解决方案。请再告诉我一件事,我如何使用节点mysql批量插入对象数组。我搜索了这个,但只找到了使用数组数组的大容量插入,即2D数组。。。你知道吗???因为MySQL不是一个对象数据库,我不知道如何插入一个对象数组。您将不得不将它们序列化为字符串,但这样您就失去了关系数据库的所有优势。如果你真的需要持久化对象,你确定MySQL就是你需要的数据库吗?:-对不起,伙计。。。我跟你说错话了。它不是对象,而是json对象,我想将其存储在mysql表中啊,这是一个好消息-您可以将json对象存储为字符串-只需在编写时将其字符串化,然后您就可以读取它并直接从中重新创建json对象,不用担心我已经成功地实现了您的解决方案(批量插入mysql),将记录插入数据库需要0.4秒,这很好,但我的节点从SQL server获取1条lac记录需要大约10-12秒。我必须提高节点js速度。(获取记录需要4-5秒)