Вставьте много данных в базу данных в очень маленьких вставках

Таким образом, у меня есть база данных, где существует много данных, вставляемых из JAVA-приложения. Usualy, которые я ввожу в table1, получают последний идентификатор, с другой стороны вставляют в table2 и получают последний идентификатор оттуда и наконец вставляют в table3 и получают тот идентификатор также и работу с ним в рамках приложения. И я вставляю приблизительно 1000-2000 строк данных каждые 10-15 минут.

И использование большого количества маленьких вставок и выбирает на производственном веб-сервере, не действительно хорошо, потому что оно иногда срывает сервер.

Мой вопрос: существует ли путь, как вставить несколько данных в table1, table2, table3, не используя такую огромную сумму выборов и вставляет? Существует ли sql-fu техника, которую я пропускаю?

7
задан BalusC 28 June 2010 в 22:06
поделиться

3 ответа

Поскольку вы, вероятно, полагаетесь на первичные ключи auto_increment, вам нужно выполнять вставки по одной, по крайней мере, для table1 и table2. Потому что MySQL не даст вам больше, чем самый последний сгенерированный ключ.

Вы никогда не должны выбирать. Вы можете получить последний вставленный идентификатор из оператора, используя метод getGeneratedKeys () . См. Пример, показывающий это, в руководстве MySQL для Connector / J:

http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-basic.html#connector-j- examples-autoincrement-getgeneratedkeys

Другие рекомендации:

  • Используйте многострочный синтаксис INSERT для table3.
  • Используйте ALTER TABLE DISABLE KEYS во время импорта и повторно включите их, когда закончите.
  • Используйте явные транзакции. Т.е. начать транзакцию перед процедурой загрузки данных и зафиксировать в конце. Я бы, вероятно, также совершил фиксацию после каждых 1000 строк table1.
  • Используйте подготовленные операторы.

К сожалению, вы не можете использовать самый быстрый метод для массовой загрузки данных, ЗАГРУЗИТЬ ИНФАЙЛ ДАННЫХ , потому что он не позволяет вам получать сгенерированные значения идентификаторов для каждой строки.

5
ответ дан 7 December 2019 в 05:17
поделиться

Здесь есть о чем поговорить:

  1. Скорее всего, задержка в сети убивает вас, если каждый из этих INSERT представляет собой еще один сетевой обход. Попробуйте группировать свои запросы так, чтобы для всей транзакции требовалось только одно обращение в оба конца.
  2. Говоря о транзакциях, вы их не упоминаете. Если все три INSERT должны быть одной единицей работы, вам лучше правильно обрабатывать транзакции. Если вы не знаете, как это сделать, лучше изучите их.
  3. Попробуйте кэшировать запросы, если они используются повторно. Самый быстрый путь туда и обратно - тот, который вы не совершите.
2
ответ дан 7 December 2019 в 05:17
поделиться

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

1
ответ дан 7 December 2019 в 05:17
поделиться
Другие вопросы по тегам:

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