Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Как добавить записи в базу mysql
цитата
30/11/09 в 08:18
 ibiz
нужно очень быстро добавить или обновить бд из 3м строк (длина строки до 100 символов), если делать стандартными средствами, то получается очень долгий процесс, есть варианты решения задачи, кроме увеличения мощностей железа?
цитата
30/11/09 в 13:42
 Dr.Syshalt
А что есть "стандартные средства"? а то их несколько на ум приходит.
цитата
30/11/09 в 14:13
 zuborg
Смотря какие конкретные условия
Добавить, изменить, и залить базу из 3М строк это разные задачи.

Как вариант, скопировать содержимое таблицы в другую таблицу, удалить лишние индексы, провести там нужные изменения без нагрузки, восстановить индексы, а дальше от ситуации - если это myisam - можно потушить мускуль и подменить файлы старой таблицы на файлы из новой. С innodb так просто не получится, там лучше не через файл, а через sql запрос или mysqldump, на это время доступ к мускуль лучше зафайрволить, или в процессе дампа блокировку поставить, типа.

lock table `tablename`;
trunc table `tablename`;
drop index idx1 from `tablename`;
drop index idx2 ...
insert into `tablename` select * from `rightvalues`;
create index idx1 ....
unlock table `tablename`;

это только схема, конкретные запросы зависят от конкретной задачи.
цитата
30/11/09 в 14:26
 Еugene
быстрее запихнуть через load data infile

вообще, 3млн записи должны запихнуться быстро.
даже если у тебя индексов дофига в таблице.

у нас есть таблица на _100+_ млн записей и то, за ночь строки + int значения запихнулись из текстового файла.
цитата
30/11/09 в 14:42
 DG
Добавить и обновить - разные вещи..
Вообще задача неясна. Обновляется ли база другими клиентами в процессе данной операции?
Я бы предложил взять копию базы, запихать туда этот массив, и поменять базы местами. С точки зрения клиента первая база практически мгновенно обновится.
цитата
30/11/09 в 14:43
 Dr.Syshalt
Еще, если таблица в innodb,

SET FOREIGN_KEY_CHECKS=0

перед загрузкой может хорошо помочь
цитата
30/11/09 в 15:58
 ibiz
есть csv файл вида
наименование1; цена1; цена2; кол-во; наличие;
наименование2; цена1; цена2; кол-во; наличие;
ежедневно он обновляется, весит около 150Mb
если его тупо читать в массив file(csv) и делать INSERT table наименование, цена1, цена2, кол-во, наличие VALUE наименование, цена1, цена2, кол-во, наличие, то вся процедура зайнимает около 30 минут или даже часа, это долго, нужно как-то уложиться на порядок меньше

появилась идея возможно както сравнивать два последних csv на наличие изменений и обрабатывать только эти изменения, пока недодумкал
цитата
30/11/09 в 19:51
 Еugene
если первый столбец уникален, то можно сделать его уникальным ключом и load data infile добавить "ignore", тогда mysql сам при загрузке из cvs файла будет сравнивать и добавлять только новые записи.
цитата
30/11/09 в 20:04
 ibiz
Еugene писал:
если первый столбец уникален, то можно сделать его уникальным ключом и load data infile добавить "ignore", тогда mysql сам при загрузке из cvs файла будет сравнивать и добавлять только новые записи.


во то что нужно, супер! smail54.gif
цитата
30/11/09 в 20:16
 Еugene
еще пример откапал у себя в хистори мускула:
Код:
load data infile 'FILE.CSV' ignore into table $table_name fields terminated by ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' (field1, field2, field3);
цитата
01/12/09 в 13:26
 zuborg
ibiz писал:
во то что нужно, супер! smail54.gif

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

Может, тебе вместо IGNORE надо написать REPLACE ?
цитата
01/12/09 в 13:48
 ibiz
не суть важно, основная проблема была быстро добавить записи в бд...
сейчас добавление 3м строк занимает 40 сек при IGNORE и 80 при REPLACE, в отличии от получаса работы моего первоначального скрипта smail101.gif


Эта страница в полной версии