2016-02-24 1 views
0

Мне нужно перенести данные из MySQL в Postgres. Легко написать сценарий, который соединяется с MySQL и Postgres, запускает выбор на стороне MySQL и вставляет на стороне Postgres, но он медленный (я имею + 1M строк). Гораздо быстрее записать данные в плоский файл, а затем импортировать их.Почему MySQL командной строки так быстро против Python?

Командная строка MySQL может быстро загружать таблицы и выводить их как значения, разделенные табуляцией, но это означает выполнение программы, внешней по отношению к моему сценарию (либо путем выполнения ее как команды оболочки, и сохранения вывода в файл, либо путем чтение непосредственно со стандартного вывода). Я пытаюсь загрузить данные с помощью Python вместо клиента MySQL.

Кто-нибудь знает, какие шаги и вызовы выполняет командная строка MySQL, чтобы запросить большой набор данных и вывести его на stdout? Я думал, что это может быть просто, что клиент находится на C и должен быть намного быстрее, чем Python, но привязка Python для MySQL сама по себе в C, поэтому ... любые идеи?

+0

Вставка медленнее, поэтому сравнение не является справедливым. –

+0

Вопрос заключается в том, чтобы запрашивать данные с помощью MySQL CLI и использовать библиотеку Python. Вставить данные COPY действительно намного быстрее –

+0

Тогда я не понимаю, о чем вы спрашиваете. Ваш заголовок о клиенте командной строки MySQL против Python, но вставка vs. read из файла в Postgres кажется существенной разницей в времени? –

ответ

0

Я считаю, что проблема в том, что вы вставляете каждую строку в отдельную транзакцию (которая является поведением по умолчанию при запуске SQL-запросов без явного запуска транзакции). В этом случае база данных должна записывать (сбросить) изменения на диск на каждом INSERT. Он может быть в 100 раз медленнее, чем вставлять данные в одну транзакцию. Попробуйте запустить BEGIN перед импортом данных и COMMIT после.