Вставка массовых данных в MySQL с помощью узла JavaScript

Я пытаюсь получить данные с сервера SQL и вставить в MySQL. У меня есть рекорд около 1 лака. Выборка записи выполняется корректно, но при вставке записей в 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');

     });
 };

person Azad Shaikh    schedule 01.12.2015    source источник
comment
Возможно, вам придется сделать фиксацию, разве это не реляционная база данных? Я давно этого не делал, но думаю, что у меня было что-то подобное в прошлом.   -  person Ewald    schedule 01.12.2015
comment
@Ewald: - данные хранятся в mysql, но проблема в том, что они не сохраняются сразу   -  person Azad Shaikh    schedule 01.12.2015
comment
Теперь я запутался, данные есть в MySQL, но их там нет сразу, что может быть из-за того, что это происходит быстрее, чем частота фиксации MySQL на диске, поэтому они все еще в журналах, обрабатываются? В этом проблема?   -  person Ewald    schedule 01.12.2015
comment
@Эвальд да ты прав   -  person Azad Shaikh    schedule 02.12.2015


Ответы (1)


Мне удалось воссоздать тот же эффект при попытке вставить тысячи поддельных записей в базу данных MySQL. Это явно перегружает журналы (из-за совместимости с ACID), поэтому у вас есть два варианта: либо ослабить соответствие ACID на время вставки (см. этот ответ), хотя обычно это ОЧЕНЬ ПЛОХАЯ ИДЕЯ, или, лучшее решение, использовать NodeJS для вставляйте записи партиями, а не по одной.

Я предлагаю вам читать, в зависимости от размера записей, 20 или 30 из них за раз, и создавать мультивставку для добавления данных в MySQL. См. эту ссылку для документации по MySQL< /а>.

Таким образом, вместо этого вы сделаете что-то вроде этого:

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

Другая альтернатива, если это массовая однократная операция, заключается в использовании NodeJS для считывания всех записей и создания документа TXT со всеми данными. MySQL очень хорошо поддерживает массовую загрузку больших объемов данных. Это было бы намного быстрее, поскольку MySQL будет считывать данные из файла партиями и вставлять их по мере продвижения. Это был бы мой предпочтительный вариант, если бы мне пришлось загружать значительные объемы данных. Полную информацию см. в документации MySQL.

Простой пример:

LOAD DATA INFILE 'mydata.txt' INTO TABLE shipmentauditlog 
FIELDS TERMINATED BY ',';
person Ewald    schedule 02.12.2015
comment
я попробую ваши решения. Скажите, пожалуйста, еще одну вещь, как я могу массово вставить массив объектов, используя node-mysql. Я ищу это, но нашел только массовую вставку с использованием массива массивов, т. Е. 2D-массива ... у вас есть какие-нибудь идеи ??? - person Azad Shaikh; 03.12.2015
comment
Поскольку MySQL не является объектной базой данных, я не понимаю, как можно вставить массив объектов. Вам придется сериализовать их в строку, но тогда вы потеряете все преимущества реляционной базы данных. Если вам действительно нужно сохранять объекты, уверены ли вы, что MySQL — это база данных, которая вам нужна? - person Ewald; 03.12.2015
comment
:- Извини, чувак... Я сказал тебе не то. это не объект, это объект json, который я хочу сохранить в таблице mysql - person Azad Shaikh; 03.12.2015
comment
Ах, это отличная новость — вы можете хранить объект JSON в виде строки — просто преобразуйте его в строку, когда вы его пишете, затем вы можете прочитать его и снова создать объект JSON прямо из него, без труда! - person Ewald; 03.12.2015
comment
:- Я успешно реализовал ваше решение (массовая вставка в mysql), для вставки записей в БД потребуется 0,4 секунды, что нормально, но моему узлу требуется около 10-12 секунд, чтобы получить 1 запись lac с сервера SQL. Мне нужно улучшить скорость node js. (нужно 4-5 секунд, чтобы получить запись) - person Azad Shaikh; 08.12.2015
comment
Вы все еще устанавливаете по одной записи в Node? Если вы хотите увеличить скорость, вам придется вставлять пакеты, скажем, по 10 записей за раз в одном операторе вставки. Это лучший способ, который я могу придумать, чтобы ускорить процесс, если вы не хотите использовать файлы массовой вставки. - person Ewald; 08.12.2015
comment
Я использую массовую вставку, как вы предлагаете («ВСТАВЬТЕ В ЗНАЧЕНИЯ журнала аудита отгрузки (1,2,3), (1,2,3), (1,1,1), (1,1,3).... ...;') который работает нормально, но моя проблема заключается в том, что node js извлекает записи с сервера sql, что занимает больше времени - person Azad Shaikh; 08.12.2015
comment
Ах я вижу! Вы выбираете МНОГО записей за раз, что определенно замедлит работу. Как насчет выбора из SQL Server меньшими партиями? См. stackoverflow.com/questions/16494393/ там есть помощь. Я не делал этого целую вечность, но меньшая партия из SQL Server, вероятно, приведет к более быстрым результатам. - person Ewald; 08.12.2015
comment
Я хочу, чтобы мое приложение узла получало максимум 5 секунд, чтобы прочитать 1 запись lac. не понимаю что делать. Узел по-прежнему получает 10 + сек. Я застрял с последних 2 дней. Помогите мне ребята - person Azad Shaikh; 08.12.2015
comment
В зависимости от того, насколько велики ваши записи, у вас могут просто возникнуть проблемы с пропускной способностью и задержкой во время операции чтения. Ваша текущая операция работает следующим образом: записи считываются, а затем вставляются в базу данных MySQL, поэтому время записи является частью времени чтения. Единственный способ сделать чтение быстрее - не записывать данные, пока вы не прочитаете все, убрав задержку, но вы будете использовать огромный объем памяти для 100 000 записей. - person Ewald; 08.12.2015
comment
конфигурация моей машины: ОЗУ 4 ГБ, процессор Intel Pentium (R) G2030 @3,00 ГГц... в этом причина производительности моего узла???? - person Azad Shaikh; 09.12.2015
comment
Node является однопоточным, все, что вы делаете, происходит в одном потоке, поэтому чтение должно быть завершено, прежде чем можно будет начать запись. Дизайн приложения медленный, я думаю, в этом и заключается проблема. - person Ewald; 10.12.2015