mysql dump import невероятно медленно на машине моего разработчика


22

У меня есть дамп SQL, он довольно большой (411 МБ), и импорт на сервере A занял 10 минут, тот же импорт на моей рабочей станции B имеет оценку (pipeviewer), равную 8 часам (импорт 31 МБ за 40 минут). ) Так что это в 53 раза медленнее.

Спецификации:

Server A:
   MySQL Version: 5.5.30-1.1 (Debian)
   2 GB RAM
   1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020

Workstation B: 
   MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
   14 GB RAM
   4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000

Конфигурация mysql / maria является стандартной конфигурацией.

Вчера я переключился на MariaDB на своей рабочей станции - но до MariaDB статистика была еще хуже.

Я уже удалил все базы данных на моей рабочей станции - без разницы.

Главный вопрос: как производительность может быть в 53 раза медленнее? Я не могу работать так :-(

Моя команда импорта:

pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'

iostat -xm 5

сервер А:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      17,43    0,00   30,28   51,85    0,00    0,44

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00   254,03    0,00 1305,45     0,00     6,09     9,56     0,78    0,60    0,00    0,60   0,57  74,25

рабочая станция B:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       7,32    0,00    3,22    5,03    0,00   84,42

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     1,40    0,80  172,40     0,00     0,56     6,72     1,17    6,75   12,00    6,72   5,40  93,52

dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

сервер А:

1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s

рабочая станция B:

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s

Можете ли вы описать мне, как вы хотите импортировать базу данных? (каково ваше конкретное утверждение mysql) Что означает "показать список процессов"; сказать? Вы смотрели, что процесс делает бетон с помощью strace? Не могли бы вы также посмотреть, может ли ваша машина поменяться местами?

Я отредактировал свой вопрос.
Алекс

InnoDB? Какова стоимость innodb_buffer_pool_sizeна каждой машине?
Рик Джеймс

Ответы:


47

Этот ответ ускорил все:

/programming//a/2167641/292408

Я просто

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;

в начале и

COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;

в конце.

Теперь это заняло 3 минуты.

(Предоставлено @andreasemer через твиттер)


Удивительные трюки. Что-то, что мне нужно знать, есть ли побочные эффекты от этого?
Дхарма Сапутра

1
Если ваши данные повреждены, ограничения внешнего ключа могут не соблюдаться после импорта.
Алекс

Отличная работа вокруг. Вы спасли меня буквально часы.
Джафо

Не ускорил производительность для меня. Без этого прошло 23 минуты, а после прошло 23 минуты (файл 3GB .sql).
Джошуа Пинтер

5

В дополнение к тому, что я вижу выше ... Мой файл дампа уже автоматически сгенерирован чем-то вроде:

mysqldump my_db > db-dump-file.sql

Я хочу , чтобы автоматизировать этот импорт , так что я создал два файла в компьютере под названием default-start-import.sqlи default-end-import.sqlи их содержимое по умолчанию пуск-import.sql :

SET autocommit=0;

и default-end-import.sql :

COMMIT;
SET autocommit=1;

и скрипт, который я запускаю, выглядит примерно так;

cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db

та же команда, но легче читать:

cat default-start-import.sql \
    db-dump-file.sql \
    default-end-import.sql \
| mysql my_other_db

В этом случае catиспользуется для объединения этих файлов перед отправкой их в канал. Я думаю, что важно, чтобы все файлы заканчивались символом новой строки (пустой строкой в ​​конце файла, если она видна из текстового редактора), чтобы catкоманда не объединяла строки между файлами.

Импорт работает нормально, я не проверял, действительно ли он быстрее из-за этого усовершенствования в функции enable-and-disable-autocommit, но если это делает вещи быстрее, то эти дополнительные шаги делают вещи проще.


1

Я пытался --compressтак же, какSET autocommit=0; и они помогли немного, однако ...

Я обнаружил, что преобразование нескольких INSERT INTO ...операторов в один большой оператор с несколькимиVALUES(...), (...) улучшенной скоростью значительно.

я использую mysql по SSL через WAN. Удаленная база данных MySQL размещена на Amazon.

С 9 столбцами и 2100 строками:

  • 2100 отдельных INSERT заявлений: 82 с
  • 2 консолидированных INSERTотчета: <1 с

С 7 столбцами и 42 000 строк:

  • 42 000 отдельных INSERT заявлений: 1 740
  • 42 консолидированный INSERTотчет: 105с

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

Примечание. Это также уменьшает .sqlразмер файла дампа в моих тестах более чем на 60%, поэтому он также экономит на операциях ввода-вывода.

Предупреждение: у этого методаmysql есть физические ограничения для тех, кому нужна мобильность ... SQL Server , по-видимому, ограничен только 1000 строками одновременно.

Тем не менее, выполнение 1000 строк одновременно для 42 000 строк по-прежнему дает улучшение на 1657%!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.