Как я могу ускорить вставку / обновление текстового поля 1-2 МБ в MySQL? - PullRequest
0 голосов
/ 02 сентября 2011

Я пишу бота, который собирает веб-страницы, но некоторые страницы имеют размер около 1-2 МБ (обычно большой, например, pantip.com), так как я могу ускорить сейчас

Обновление для каждой строки занимает 4-9 секунд, если встречается более 1 МБ страниц.

Спасибо заранее

Ответы [ 3 ]

1 голос
/ 02 сентября 2011

Вы должны обязательно увеличить max_allowed_packet и перезапустить mysql. Что-то вроде

[mysqld]
max_allowed_packet=256M

Одним из тихих убийц MySQL является пакет MySQL, который регулируется max_allowed_packet .

Понимание, что такое пакет MySQL, может прояснить это.

В соответствии с страницей 99 «Понимание внутренних компонентов MySQL» (ISBN 0-596-00957-7) , здесь приводятся параграфы 1-3, поясняющие это:

Код сетевой связи MySQL был написано в предположении, что запросы всегда достаточно короткие, и, следовательно, могут быть отправлены и обрабатываются сервером в один кусок, который в MySQL называется package терминология. Сервер выделяет память для временного буфера для хранения пакет, и он запрашивает достаточно подходит полностью. Эта архитектура требует меры предосторожности, чтобы избежать серверу не хватает памяти --- шапка на размер пакета, который это Вариант выполнения.

Код интереса по отношению к эта опция найдена в SQL / net_serv.cc . Взгляните на my_net_read () , затем следуйте вызову my_real_read () и оплатите особое внимание к net_realloc () .

Эта переменная также ограничивает длину результата многих струнных функций. См. sql / field.cc и sql / intem_strfunc.cc для подробностей.

Учитывая это объяснение, массовые INSERT-ы довольно быстро загружают / выгружают MySQL Packet. Это особенно верно, когда max_allowed_packet слишком мал для данной загрузки данных, поступающих на него.

ЗАКЛЮЧЕНИЕ

В большинстве установок MySQL я обычно устанавливаю 256M или 512M. Вы должны поэкспериментировать с большими значениями при загрузке данных, включающей поля BLOB и TEXT.

0 голосов
/ 02 сентября 2011

Мы можем помочь вам лучше, если вы покажете нам запросы, информацию о таблице (SHOW CREATE TABLE), информацию о сервере, настройках MySQL и, возможно, некоторые примеры данных.

Но в целом:

  • Попробуйте использовать транзакции: BEGIN TRANSACTION, много вставок, COMMIT будет быстрее, чем много вставок;
  • Вы можете делать INSERT в кеше,во временных таблицах или в файлах, и только позднее загружайте их в постоянную таблицу.
  • Вы должны позаботиться о правильной настройке сервера, используя правильный размер для ваших буферов и правильный механизм хранения таблиц.
  • Вы можете разбить таблицу на несколько дисков, чтобы ускорить вставки.
  • Вы можете отключить триггеры и индексы во время вставок.
  • Если вы вставляете несколько строк одновременно, сделайте однуВставка с несколькими значениями.
0 голосов
/ 02 сентября 2011

использовать LOAD DATA вместо вставки для массовой вставки

Используете ли вы отдельные операторы для каждой записи?Возможно, вы захотите посмотреть инфо-файл LOAD DATA для массового обновления.

Советы по быстрой вставке:

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

вставка в таблицу (col1, col2) значений (val1, val2), (val3, val4), ...

Удалите все ключи / индексы перед вставкой.

Делайте это на самой быстрой машине, которая у вас есть (в основном, для ввода-вывода, но также важны оперативная память и процессор).Как сервер БД, так и клиент для вставки, помните, что вы будете платить вдвое большую цену ввода-вывода (после чтения, второй вставки)

MySQL Вставка больших наборов данных из файла с Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...