Реклама на сайте Advertise with us

Как добавить записи в базу mysql

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 30/11/09 в 08:18       Ответить с цитатойцитата 

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

0
 

Чингачгук, вождь красноглазых

С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824

Ссылка на сообщениеДобавлено: 30/11/09 в 13:42       Ответить с цитатойцитата 

А что есть "стандартные средства"? а то их несколько на ум приходит.

0
 



С нами с 01.02.07
Сообщения: 231
Рейтинг: 294

Ссылка на сообщениеДобавлено: 30/11/09 в 14:13       Ответить с цитатойцитата 

Смотря какие конкретные условия
Добавить, изменить, и залить базу из 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`;

это только схема, конкретные запросы зависят от конкретной задачи.

8
 



С нами с 10.12.03
Сообщения: 1615
Рейтинг: 870

Ссылка на сообщениеДобавлено: 30/11/09 в 14:26       Ответить с цитатойцитата 

быстрее запихнуть через load data infile

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

у нас есть таблица на _100+_ млн записей и то, за ночь строки + int значения запихнулись из текстового файла.

нету у меня подписи...

8
 



С нами с 11.08.06
Сообщения: 939
Рейтинг: 849

Ссылка на сообщениеДобавлено: 30/11/09 в 14:42       Ответить с цитатойцитата 

Добавить и обновить - разные вещи..
Вообще задача неясна. Обновляется ли база другими клиентами в процессе данной операции?
Я бы предложил взять копию базы, запихать туда этот массив, и поменять базы местами. С точки зрения клиента первая база практически мгновенно обновится.

8
 

Чингачгук, вождь красноглазых

С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824

Ссылка на сообщениеДобавлено: 30/11/09 в 14:43       Ответить с цитатойцитата 

Еще, если таблица в innodb,

SET FOREIGN_KEY_CHECKS=0

перед загрузкой может хорошо помочь

8
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 30/11/09 в 15:58       Ответить с цитатойцитата 

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

появилась идея возможно както сравнивать два последних csv на наличие изменений и обрабатывать только эти изменения, пока недодумкал

0
 



С нами с 10.12.03
Сообщения: 1615
Рейтинг: 870

Ссылка на сообщениеДобавлено: 30/11/09 в 19:51       Ответить с цитатойцитата 

если первый столбец уникален, то можно сделать его уникальным ключом и load data infile добавить "ignore", тогда mysql сам при загрузке из cvs файла будет сравнивать и добавлять только новые записи.

нету у меня подписи...

8
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 30/11/09 в 20:04       Ответить с цитатойцитата 

Еugene писал:
если первый столбец уникален, то можно сделать его уникальным ключом и load data infile добавить "ignore", тогда mysql сам при загрузке из cvs файла будет сравнивать и добавлять только новые записи.


во то что нужно, супер! smail54.gif

0
 



С нами с 10.12.03
Сообщения: 1615
Рейтинг: 870

Ссылка на сообщениеДобавлено: 30/11/09 в 20:16       Ответить с цитатойцитата 

еще пример откапал у себя в хистори мускула:
Код:
load data infile 'FILE.CSV' ignore into table $table_name fields terminated by ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' (field1, field2, field3);

нету у меня подписи...

8
 



С нами с 01.02.07
Сообщения: 231
Рейтинг: 294

Ссылка на сообщениеДобавлено: 01/12/09 в 13:26       Ответить с цитатойцитата 

ibiz писал:
во то что нужно, супер! smail54.gif

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

Может, тебе вместо IGNORE надо написать REPLACE ?

0
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 01/12/09 в 13:48       Ответить с цитатойцитата 

не суть важно, основная проблема была быстро добавить записи в бд...
сейчас добавление 3м строк занимает 40 сек при IGNORE и 80 при REPLACE, в отличии от получаса работы моего первоначального скрипта smail101.gif

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »