С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 30/11/09 в 08:18 |
нужно очень быстро добавить или обновить бд из 3м строк (длина строки до 100 символов), если делать стандартными средствами, то получается очень долгий процесс, есть варианты решения задачи, кроме увеличения мощностей железа?
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 30/11/09 в 13:42 |
А что есть "стандартные средства"? а то их несколько на ум приходит.
|
|
|
|
С нами с 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`;
это только схема, конкретные запросы зависят от конкретной задачи.
|
|
|
|
С нами с 10.12.03
Сообщения: 1615
Рейтинг: 870
|
Добавлено: 30/11/09 в 14:26 |
быстрее запихнуть через load data infile
вообще, 3млн записи должны запихнуться быстро.
даже если у тебя индексов дофига в таблице.
у нас есть таблица на _100+_ млн записей и то, за ночь строки + int значения запихнулись из текстового файла.
|
|
|
|
С нами с 11.08.06
Сообщения: 939
Рейтинг: 849
|
Добавлено: 30/11/09 в 14:42 |
Добавить и обновить - разные вещи..
Вообще задача неясна. Обновляется ли база другими клиентами в процессе данной операции?
Я бы предложил взять копию базы, запихать туда этот массив, и поменять базы местами. С точки зрения клиента первая база практически мгновенно обновится.
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 30/11/09 в 14:43 |
Еще, если таблица в innodb,
SET FOREIGN_KEY_CHECKS=0
перед загрузкой может хорошо помочь
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 30/11/09 в 15:58 |
есть csv файл вида
наименование1; цена1; цена2; кол-во; наличие;
наименование2; цена1; цена2; кол-во; наличие;
ежедневно он обновляется, весит около 150Mb
если его тупо читать в массив file(csv) и делать INSERT table наименование, цена1, цена2, кол-во, наличие VALUE наименование, цена1, цена2, кол-во, наличие, то вся процедура зайнимает около 30 минут или даже часа, это долго, нужно как-то уложиться на порядок меньше
появилась идея возможно както сравнивать два последних csv на наличие изменений и обрабатывать только эти изменения, пока недодумкал
|
|
|
|
С нами с 10.12.03
Сообщения: 1615
Рейтинг: 870
|
Добавлено: 30/11/09 в 19:51 |
если первый столбец уникален, то можно сделать его уникальным ключом и load data infile добавить "ignore", тогда mysql сам при загрузке из cvs файла будет сравнивать и добавлять только новые записи.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 30/11/09 в 20:04 |
Еugene писал: | если первый столбец уникален, то можно сделать его уникальным ключом и load data infile добавить "ignore", тогда mysql сам при загрузке из cvs файла будет сравнивать и добавлять только новые записи. |
во то что нужно, супер!
|
|
|
|
С нами с 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);
|
|
|
|
|
С нами с 01.02.07
Сообщения: 231
Рейтинг: 294
|
Добавлено: 01/12/09 в 13:26 |
ibiz писал: | во то что нужно, супер! |
Ты бы сразу тогда в условии писал, что записи, которые в базе уже есть (по значению определенного поля) - обновлять не нужно.
Правда, не сильно себе представляю, где может понадобиться игнорировать изменения старых строк, но не игнорировать добавления новых строк.
Может, тебе вместо IGNORE надо написать REPLACE ?
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 01/12/09 в 13:48 |
не суть важно, основная проблема была быстро добавить записи в бд...
сейчас добавление 3м строк занимает 40 сек при IGNORE и 80 при REPLACE, в отличии от получаса работы моего первоначального скрипта
|
|
|
|