Ускорить импорт данных в MyIsam таблицу MySQL
Сегодня потребовалось залить в базу, в таблицу MyIsam порядка 100 млн записей и все бы ничего, но на моем втором маленьком сервачке, это происходило очень долго, причина была в том, что на нем всего 700 мб ОЗУ...
Оставил на ночь, до утра залилось порядка 4 млн, однако это все равно очень медленно, тогда-то я и подумал, что проблема кроется в том, что индексы читаются с диска - это и причина медленной скорости. Надо заметить, что записи в таблице должны быть уникальными, именно поэтому и использовался уникальный индекс.
В общем, поразмыслив я решил убедиться в правоте своих мыслей, и полез вспоминать, как увеличить кол-во ОЗУ, выделяемое для индексов MySQL. Решение не заставило себя долго ждать, и я нашел вот эту заметку: Import data faster. В ней как раз был тот параметр который я искал (я знал что он есть, но не помнил точного названия): key-buffer. Именно он и отвечал за буфер индексов.
После этого, я перенес скрипт с сервачка, к себе на рабочий компьютер с 16 Гб оперативки, настроил в файлик my.cnf параметр key_buffer_size увеличив его до 10Гб. И запустил скрипт, где-то за час скрипт справился с работой и я получил 20 млн уникальных записей. Т.е. изменением одной цифры и переходом на более мощное железо, я выполнил работу в 5 раз быстрее (если бы оставил на сервачке, я бы ждал завершения ещё: (20/4-1)*10 = 40 часов).
После того как все давнные были импортированы, я просто скопировал бинарные файлы базы на маленький сервачок, тем самым перенеся уже готовую базу.
Другой похожий случай сэкономленого времени, у меня был, когда мне потребовалось скопировать с одного сервачка какой-то объем файлов, поставив копирование, я увидел оценочное время в 8 часов. Типа того: 🙂
Тогда я посмотрел скорость и увидел, что копирование идет через роутер на скорости всего 100 мбит/с. Тогда я убрал роутер из цепочки и кинул временный кабель, при этом получив 1 Гбит/с, тем самым время копирования я сократил до 50 минут. После того как закончил копировать, снова вернул роутер в цепочку. Вот так 5 минут, которые я потратил на то, чтобы кинуть временный кабель напрямую, сэкономили мне 7 часов ожидания..
Мораль сей басни такова: во-первых, не жалейте денег на оборудование, оно сэкономит вам часы работы. Во-вторых, почитывайте про конфигурацию софта с которым работаете, таким образом, вы хотя бы примерно, будете представлять как и что можно ускорить. В моем случае, я сэкономил себе 40 часов ожидания. Ну, а в третьих, думайте всегда головой, это довольно часто помогает упростить жизнь 🙂
P.S. Если кому интересно, что это за объем данных (100 млн), то это url-ы с ключевыми слова с моего сервера статистики посещаемости проектов. Когда переходят по ссылке из ПС, то в $_SERVER['HTTP_REFERER'] хранится ссылка с поисковым запросом, вот именно эти ссылки я и обрабатывал. Далее я вырежу из них адреса поисковых систем и запросы, и буду проводить некоторые статистические исследования.
Author: | Tags: /
| Rating:
Leave a Reply