Транзакция MySQL с тысячами Вставок - сколько “распространений в прямом и обратном направлениях” требуется?

через прототип с forEach (), который должен пропустить свойства цепи прототипа:

Object.prototype.each = function(f) {
    var obj = this
    Object.keys(obj).forEach( function(key) { 
        f( key , obj[key] ) 
    });
}


//print all keys and values
var obj = {a:1,b:2,c:3}
obj.each(function(key,value) { console.log(key + " " + value) });
// a 1
// b 2
// c 3
9
задан the Tin Man 4 October 2012 в 21:07
поделиться

6 ответов

MySQL имеет расширенный стиль SQL, который может использоваться, где масса вставляет, помещаются в несколько за один раз:

INSERT INTO `table` (`id`, `event`)  VALUES (1, 94263), (2, 75015), (3, 75015);

Я буду обычно собирать несколько сотен вставлять-частей в строку прежде, чем выполнить сам SQL-запрос. Это уменьшит издержки парсинга и коммуникации путем пакетной обработки их самостоятельно.

18
ответ дан 4 December 2019 в 08:17
поделиться

Это делает одно распространение в прямом и обратном направлениях на запрос, который Вы отправляете (независимо от того, является ли это в транзакции или не).

Это возможно в MySQL, для использования "расширенный вставляют" синтаксис, который позволяет Вам вставлять несколько (или действительно, многие) строки в отдельном операторе. Это обычно считают Хорошей Вещью.

2
ответ дан 4 December 2019 в 08:17
поделиться

Распространение в прямом и обратном направлениях к серверу БД не является тем же как распространением в прямом и обратном направлениях к базе данных по диску.

Прежде чем Вы решите, что распространения в прямом и обратном направлениях являются узким местом, сделайте некоторые фактические измерения.

Существуют способы вставить несколько строк с единственной вставкой, в зависимости от Вашего DBMS. Прежде чем Вы инвестируете усилие по кодированию, выясните, принесет ли оно, вероятно, Вам пользу.

2
ответ дан 4 December 2019 в 08:17
поделиться

При использовании MySQL 4.x несколько лет назад, мы столкнулись с жестким пределом размера запроса, который не настраивался.

Это, вероятно, не поможет Вам как:

  1. Я не помню, каков жесткий предел был.
  2. Вы, вероятно, не используете MySQL 4.x.
  3. Мы не использовали транзакции.

Удачи!

0
ответ дан 4 December 2019 в 08:17
поделиться

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

В MSSql можно выполнить несколько вставок в отдельном операторе:

cmd.ExecuteNonQuery "insert table values (1)  insert table values (2)"

Таким образом, можно создать большую строку и выполнить ее (я думаю, что она будет иметь предел), я предполагаю, что это будет работать на MySQL.

Также в MSSQL у Вас есть пакетная вставка (поиск "SqlBulkCopy"), в MySQL, возможно, пытаются загрузить данные из временного файла.

0
ответ дан 4 December 2019 в 08:17
поделиться

Это зависит от того, где вы вызываете оператор SQL. Я попробовал один раз с драйвером MySQL JDBC и получил сообщение об ошибке, что ограничение составляет 1 МБ, но его можно настроить.

Я не стал пытаться настроить его, а просто разбил операторы SQL на более мелкие части.

0
ответ дан 4 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: