2016-10-23 1 views
1

Я запускаю node-mysql для вставки данных в мою базу данных MySQL, использующую DynamoDB.Одиночный пакетный запрос или сопоставленные запросы для эффективности?

У меня есть варианты выполнения запросов вставки «мини» внутри для цикла:

var myData= [{"key": "abc", "value": "xyz"},{..},{..}] 
var mapData = myData.map(function(data){ 
    var key = data.key; 
    var value = data.value; 
    var payload = { 
     key: key, 
     value: value 
    }; 

    connection.query("INSERT INTO mytable SET ?", payload, function(err,result){ 
     //Do stuff 
    }); 
}); 

В качестве альтернативы можно использовать вложенный подход массива:

myData = [["key", "value"], [.., ..], [.., ..]] 
connection.query("INSERT INTO mytable (key, value) VALUE ?", [myData], function(err, result){ 
    //Do Stuff.. 
}); 

Мои база данных очень велики и Массив myData также будет очень большим.

Какой метод является наиболее эффективным?

+0

'INSERT INTO mytable (ключ, значение) VALUE' ... это даже не запускается, потому что это должно быть« VALUES ». Но это в стороне, планируете ли вы включить несколько записей в обоих вариантах синтаксиса «INSERT»? Если да, то почему вы ожидаете, что он будет значительно быстрее/медленнее, чем другой? –

ответ

1

В таких сценариях, если производительность важна, тогда неплохо провести собственные тесты на оборудовании, на котором вы собираетесь запускать приложение. Факторы такой задержки в сети, задержки на диске и доступной ОЗУ вступают в игру - наряду с тем, насколько занят сервер базы данных другими запросами или задачами.

Во многих сценариях вы ожидаете, что предыдущая операция будет самой быстрой, поскольку только один раз аналитик запросов MySQL должен пройти один раз, и данные могут быть записаны навалом в постоянное хранилище, а не так много мелких записей - хотя еще раз это зависит от того, какие параметры настройки флеша используются вашей базой данных и ОС.

Недостатком большой записи является то, что базе данных необходимо подождать, пока она не будет иметь весь запрос, прежде чем она сможет ее обработать, поскольку она должна проверять всю запись, и в зависимости от формата таблицы MySQL она может блокироваться таблицу, предотвращающую другие операции. Короткие записи меньшего размера могут ускорить выполнение задания.

Обратите внимание, что MySQL имеет значение max_allowed_packet, значение которого требует увеличения для подлинно больших записей.

TLDR - Если это важно, проверьте оба варианта и используйте то, что работает в вашем конкретном приложении.

+0

В настоящее время я запускаю подход меньшего запроса, однако у меня возникают значительные проблемы с очередью запросов, поскольку строки блокируются длинными обрабатывающими запросами. Раньше у вас был этот опыт? –

+0

Не определенно. Однако mysql_dump использует «вложенный» подход при создании запросов для клонирования баз данных. Так что «вложенным» может быть путь. Возможно, вставка 20-50 строк на запрос, хотя это действительно зависит от размера данных. Если он превышает max_allowed_packet, тогда вставка будет отклонена. –