Какой вариант наиболее эффективен для вставки данных в MySQL DB? - PullRequest
0 голосов
/ 28 июля 2011

У меня есть база данных mysql с несколькими таблицами, назовем их Table1, Table2 и т. Д. Мне нужно сделать несколько вызовов для каждой из этих таблиц

, которая наиболее эффективна,

) Собирает все запросы для каждой таблицы в одном сообщении, затем выполняет их отдельно, например:

INSERT INTO TABLE1 VALUES (A,B);
INSERT INTO TABLE1 VALUES (A,B);

... execute

INSERT INTO TABLE2 VALUES (A,B);
INSERT INTO TABLE2 VALUES (A,B);

... execute

б) Сбор ВСЕХ запросов в одно длинное сообщение (не в порядке таблицы), затем выполнение этого запроса, например:

INSERT INTO TABLE1 VALUES (A,B);
INSERT INTO TABLE2 VALUES (B,C);
INSERT INTO TABLE1 VALUES (B,A);
INSERT INTO TABLE3 VALUES (D,B);

в) Что-то еще?

В настоящее время я делаю это каквариант (б), но мне интересно, есть ли лучший способ.

(я использую jdbc для доступа к БД, в отличном сценарии).

Спасибо!

Ответы [ 3 ]

1 голос
/ 28 июля 2011

Не публикуя свой код, вы сделали это немного дикой догадкой, но в этом сообщении в блоге демонстрирует значительные улучшения производительности при использовании метода groovy Sql.withBatch .

Код, который они показывают (который использует sqlite ), воспроизводится здесь для потомков:

Sql sql = Sql.newInstance("jdbc:sqlite:/home/ron/Desktop/test.db", "org.sqlite.JDBC")
sql.execute("create table dummyTable(number)")

sql.withBatch {stmt->
    100.times {
      stmt.addBatch("insert into dummyTable(number) values(${it})")
    }
    stmt.executeBatch()
}

, который вставляет числа от 1 до 1000 в таблицу dummyTable

Очевидно, что для работы с вашим неизвестным кодом потребуется настройка

1 голос
/ 28 июля 2011

Третий вариант - использование подготовленных выписок.

0 голосов
/ 28 июля 2011

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

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

Если ваша таблица не так уж велика или параллелизм не является проблемой, то обязательно делайте что угодно. Вы должны посмотреть на slow logs операторов и посмотреть, какой оператор быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...