Извлечение отчетов из больших таблиц кусками - PullRequest
2 голосов
/ 26 июня 2019

Вопрос может показаться немного общим.Еще.У нас есть таблица с сотнями миллионов записей.Чтобы сделать отчет, к нему присоединяются еще несколько небольших таблиц.Индексы создаются для всех соответствующих столбцов.Клиент хочет получить отчет за год +, который может быть длиной до 100 миллионов строк.

Чтобы обезопасить процесс, скажем, если сценарий умирает или если соединение с БД прекращается, отчет долженбыть извлеченным порциями, поэтому следующий процесс забирает отчет, в котором умер предыдущий.

Проблема заключается в том, что отчет может быть отсортирован по столбцам varchar / int, которые могут содержать имена клиентов, номера счетов, различные личные данные.данные в разных форматах и ​​т.д.с этим количеством данных.Нет архивных таблиц, нет разделения, данные не объединяются в отдельные таблицы.Просто огромная порция данных в одной таблице.

Существует ли какой-то устоявшийся (волшебный?) Способ решения этой проблемы?

1 Ответ

1 голос
/ 26 июня 2019

"Существует ли установленный (волшебный?) Способ решения такой проблемы?" - Вы спрашиваете о нескольких вещах, которые я потратил много времени на совершенствование.

«сотни миллионов записей ... отчет» и «отчет могут быть отсортированы по различным столбцам» - с таблицей «Сводка», которая может выполняться намного быстрее: http://mysql.rjweb.org/doc.php/summarytables. И сводная таблица помогает с сортировкой.

«Индексы созданы для всех соответствующих столбцов» - извините за мой цинизм, но я обнаружил, что эта фраза означает, что у вас есть набор из одного столбца INDEXes, но вы не узнали о пользе подходящих » составные индексы. http://mysql.rjweb.org/doc.php/index_cookbook_mysql и http://mysql.rjweb.org/doc.php/index1

«использование LIMIT и OFFSET» - вот почему это очень неэффективно: http://mysql.rjweb.org/doc.php/pagination. Я не вижу OFFSET необходимого для решения вашей проблемы. «Запоминание того, где вы остановились», может помочь в разбивке на , первоначально , создать сводную таблицу (таблицы).

«соединение с БД прекращается» - приведенные выше советы должны сделать это достаточно быстро, чтобы избежать этой проблемы. Если нет, укажите SHOW CREATE TABLE, SELECT и, возможно, другие сведения.

"Чанкинг" - вот советы по чанкингу, но я не думаю, что это решение для рассматриваемой проблемы: http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks

"сотни миллионов записей ... в одной таблице" - не проблема. Мои советы нацелены на этот размер.

"нет разделения" - хорошо. Мне не придется тратить время на то, чтобы убедить вас, что разделение вряд ли поможет: http://mysql.rjweb.org/doc.php/partitionmaint

Вы выиграли приз. Я не думаю, что когда-либо указывал на 6 моих блогов, чтобы ответить на один вопрос.

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