Автор Тема: Большой INSERT|UPDATE  (Прочитано 5496 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Большой INSERT|UPDATE
« : 04 Октября 2005, 17:13:33 »
Задача такая: есть большой объем данных, который нужно "добавить" к существующей таблице в MySQL. Где-то семьсот-восемьсот записей.
Таблица же раз в 20 большая, т.е. около 15 тыс записей.

Нужно "слить" данные по ключу, т.е. получить общую таблицу, где для совпадающих ключей проведен UPDATE, для отсутствующих - INSERT.

А вопрос вот в чем: доступ к таблице перекрывать нельзя. Из нее практически постоянно идет select-выборка.

Как сделать? Что посоветуете применить? INSERT DELAYED? А как быть с апдейтами?

К сожалению, в SQL я не слишком опытен, с радостью приму и "мордой в ман".
LJ: Backslashed life (rss)

Оффлайн fidget

  • Непоседа
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 607
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Большой INSERT|UPDATE
« Ответ #1 : 05 Октября 2005, 00:36:32 »
Попробуйте сделать LOAD DATA INFILE .. REPLACE.
Но пока записи будут загружаться таблица у вас все равно будет залочена. Если у вас таблицы MyISAM, то вам этого ну никак не избежать.
На Машине Тьюринга далеко не уедешь.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Большой INSERT|UPDATE
« Ответ #2 : 05 Октября 2005, 10:17:12 »
CGVictor
ИХМО
как вариант делать постепенный цекличный INSERT\\UPDATE т.е. после каждого обновления рвать конект и спать несколько секунд...

или же так:
исходная таблица - tmp
создать tmp_1 залить в неё все данные из tmp и новые ... дальше сделать следующее:
DROP TABLE tmp;
ALTER Table tmp_1 RENAME TO tmp;
And no religion too...

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Большой INSERT|UPDATE
« Ответ #3 : 05 Октября 2005, 11:46:52 »
commander
Да, подумываю над альтером.
Чтение же, как я помню, таблицу не лочит?
Да, пока этот вариант.

fidget
А что можно противопоставить MyISAM в этом плане?
LJ: Backslashed life (rss)

Оффлайн fidget

  • Непоседа
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 607
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Большой INSERT|UPDATE
« Ответ #4 : 06 Октября 2005, 01:04:49 »
> Чтение же, как я помню, таблицу не лочит?

лочит. ставит read lock.

> А что можно противопоставить MyISAM в этом плане?

ну это зависит от того что у вас вообще за система, какие запросы, как часто надо заливать такие данные. В том же InnoDB поддерживается row-level locking, но в общем случае InnoDB медленнее. т.е. имеет смысл его смотреть когда у вас много одновременных разнородных запросов.
На Машине Тьюринга далеко не уедешь.

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Большой INSERT|UPDATE
« Ответ #5 : 06 Октября 2005, 11:47:24 »
fidget
Так, принято.

Цитировать
fidget:
read lock

INSERT DELAYED их подружит?...

Цитировать
fidget:
что у вас вообще

Корпоративный вебфронт, надо сливать историю документов из бухгалтерии фирмы где-то 1-4 раза в день в базу на хосте. Мне будет прилетать только инкремент (иначе канал загнется на*), отсюда и задача.

Медленность, конечно, не плюс, но
а нет какого-нибудь русского summary по типам таблиц в MySQL?
LJ: Backslashed life (rss)

Оффлайн fidget

  • Непоседа
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 607
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Большой INSERT|UPDATE
« Ответ #6 : 06 Октября 2005, 13:26:26 »
> INSERT DELAYED их подружит?

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

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

Попробуйте все-таки LOAD DATA, только поиграйтесь еще с настройками bulk_insert_buffer_size и key_buffer_size. Увеличение размера этих буфером должно положительно сказаться на производительности добавления данных.

> а нет какого-нибудь русского summary по типам таблиц в MySQL?

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

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Большой INSERT|UPDATE
« Ответ #7 : 07 Октября 2005, 15:03:28 »
fidget
А нет ли способа на уровне базы/запроса задать, чтобы INSERT для существующей записи прокатывал как UPDATE?
LJ: Backslashed life (rss)

Оффлайн fidget

  • Непоседа
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 607
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Большой INSERT|UPDATE
« Ответ #8 : 07 Октября 2005, 18:40:18 »
CGVictor, есть REPLACE и есть INSERT .. ON DUPLICATE KEY UPDATE.
На Машине Тьюринга далеко не уедешь.

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Большой INSERT|UPDATE
« Ответ #9 : 07 Октября 2005, 19:45:13 »
fidget
Ага, вектор ясен....будем копать
LJ: Backslashed life (rss)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28