Как БЫСТРО вывести несколько млн.строк в txt из mariaDB(mySQL)?

Есть БД , содержащая в себе 10млн записей в одной таблице, и примерно 1,5 млрд в другой. И еще пара мелких(до 200 записей) таблиц. Это только для разработки, потом будет минимум в 20 раз больше.

Сервер - dedicated i7-7700k, 32GB RAM, SSD 2*256GB(потом добавим еще);

Запрос вида

SELECT DISTINCT acc.email, acc.password
FROM accounts acc JOIN accounts_status st ON acc.id_account=st.account_id
WHERE st.service_id in(1,5,8,7,122,147,80,58,77,60,55,15,22,14,16,78,75) AND st.status = 1


в dbForgeStudio выполняется примерно за 0,2 сек(правда, включен постраничный режим). В консоли mysql - ничего путного не выходит, а если добавить LIMIT 1000000 то вывод происходит за минуту. При использовании INTO OUTFILE - ситуация аналогична.

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

Как реализовать быстрое(в адекватное время) извлечение из базы в текстовый файл?

---ОБНОВЛЕНО 1:47 02-09-2017
Похоже, дело таки в скорости работы самого запроса. В dbForgeStudio переключил Результаты в виде таблицы на Результаты в виде текста и получил уже совсем другое время выполнения запроса. Теперь вопрос в том, как можно оптимизировать время выполнения. Думаю, для этого лучше будет создать новый вопрос.
  • Вопрос задан
  • 1481 просмотр
Решения вопроса 1
@asd111
Уверены что тормозит запись, а не сам запрос ?
В вашем случае если средняя длина результата 50 байт, то 1 млн. таких записей это примерно 50 MB т.е. это запишется на SSD за 1 сек.
Сделайте
explain SELECT DISTINCT acc.email, acc.password
FROM accounts acc JOIN accounts_status st ON acc.id_account=st.account_id
WHERE st.service_id in(1,5,8,7,122,147,80,58,77,60,55,15,22,14,16,78,75) AND st.status = 1 LIMIT 100000
возможно проблема в индексах.
Посмотрите индексы SHOW INDEXES FROM accounts, SHOW INDEXES FROM accounts_status
Посмотрите чему равно у вас innodb_buffer_pool_size в конфигах mysql, должно быть 22400M примерно для 32 GB.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы