【问题标题】:Inserting bulk data into MySQL using node JavaScript使用节点 JavaScript 将批量数据插入 MySQL
【发布时间】:2015-12-01 11:24:00
【问题描述】:

我正在尝试从 SQL 服务器获取数据并插入 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');

     });
 };

【问题讨论】:

  • 您可能需要进行提交,这不是关系数据库吗?我有一段时间没做过了,但我想我过去也有类似的事情。
  • @Ewald :- 数据存储在 mysql 中,但问题是,它不是一次存储数据
  • 现在我很困惑,数据在 MySQL 中,但不是立即出现,这可能是它发生的速度比 MySQL 提交到磁盘的频率要快,所以它还在日志中,正在处理中?是这个问题吗?
  • @Ewald 是的,你是对的

标签: mysql node.js node-mysql


【解决方案1】:

在尝试将数千条虚假记录插入 MySQL 数据库时,我也设法重现了相同的效果。这显然会使日志过载(因为 ACID 合规性),因此您有两个选择 - 要么在插入期间放松 ACID 合规性(请参阅this answer),尽管这通常是一个非常糟糕的想法,或者更好的解决方案是使用 NodeJS 批量插入你的记录,而不是一个一个地插入。

我的建议是,根据记录的大小,一次读取 20 或 30 条记录,然后构建一个多插入以将数据添加到 MySQL。见this link for the MySQL documentation。

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

'INSERT INTO shipmentauditlog VALUES (1,2,3), (1,2,3), (1,1,1), (1,1,3);'

如果这是一个大规模的一次性操作,另一种选择是使用 NodeJS 读取所有记录并创建一个包含所有数据的 TXT 文档。 MySQL 对海量数据的批量加载有很好的支持。这会快很多,因为 MySQL 会分批从文件中读取数据并在执行过程中将其插入。如果我必须加载大量数据,那将是我的首选。详情请参阅MySQL Documentation。

一个简单的例子是:

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

【讨论】:

  • 我会试试你的解决方案。请告诉我一件事,如何使用 node-mysql 批量插入对象数组。我搜索了这个,但发现只使用数组数组进行批量插入,即二维数组......你知道吗???
  • 由于 MySQL 不是对象数据库,我不明白如何插入对象数组。您将不得不将它们序列化为字符串,但随后您将失去所有关系数据库的优势。如果你真的需要持久化对象,你确定 MySQL 是你需要的数据库吗?
  • :- 对不起,伙计...我告诉你错了。它不是对象它是我想存储在 mysql 表中的 json 对象
  • 啊,真是个好消息——您可以将 JSON 对象存储为字符串——只需在编写时对其进行字符串化,然后您就可以读取它并再次直接从中重新创建 JSON 对象,不费吹灰之力!
  • :- 我已经成功实现了您的解决方案(批量插入 mysql)将记录插入数据库需要 0.4 秒,这很好,但我的节点需要大约 10 -12 秒才能从中获取 1 lac 记录SQL 服务器。我必须提高节点 js 的速度。 (需要 4-5 秒来获取记录)
猜你喜欢
  • 1970-01-01
  • 2014-12-08
  • 2016-10-13
  • 2011-01-14
  • 1970-01-01
  • 2018-04-17
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多