Общие > Базы данных

Большой INSERT|UPDATE

(1/2) > >>

CGVictor:
Задача такая: есть большой объем данных, который нужно "добавить" к существующей таблице в MySQL. Где-то семьсот-восемьсот записей.
Таблица же раз в 20 большая, т.е. около 15 тыс записей.

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

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

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

К сожалению, в SQL я не слишком опытен, с радостью приму и "мордой в ман".

fidget:
Попробуйте сделать LOAD DATA INFILE .. REPLACE.
Но пока записи будут загружаться таблица у вас все равно будет залочена. Если у вас таблицы MyISAM, то вам этого ну никак не избежать.

commander:
CGVictor
ИХМО
как вариант делать постепенный цекличный INSERT\\UPDATE т.е. после каждого обновления рвать конект и спать несколько секунд...

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

CGVictor:
commander
Да, подумываю над альтером.
Чтение же, как я помню, таблицу не лочит?
Да, пока этот вариант.

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

fidget:
> Чтение же, как я помню, таблицу не лочит?

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

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

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

Навигация

[0] Главная страница сообщений

[#] Следующая страница

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 
Перейти к полной версии