MySQL разбиение или удаление старых данных? - PullRequest
3 голосов
/ 12 апреля 2020

У меня есть таблица недавних действий на mySQL, ее MyISAM и содержит около 46 миллионов записей. Он был правильно проиндексирован и все, что сделано. Но для выполнения некоторых запросов все равно может потребоваться несколько секунд.

Поэтому мне было интересно, как лучше всего повысить производительность запросов в этой базе данных. Должен ли я разбить таблицу или удалить более старые данные? В основном я использую некоторые расчеты для данных за этот месяц для запросов, другое использование показывает пользователям их недавние действия, а также нам время от времени приходится вручную контролировать их действия.

Я думал удалить все данные старше этого года, что должно удалить около 24 миллионов строк. (так как прошло 4 месяца с начала этого месяца, поэтому старые данные не должны иметь такого большого значения).

Или я могу разделить по месяцам, но я не знаю, как это реализовано в laravel мне придется каждый раз менять разделы, чтобы получить данные старше, чем текущие месяцы?

Edit: этот 1 запрос является важным, он выполняется после определенного действия c от пользователя, и этот указанный c запрос выполнялся за 8 секунд и прошел 40 000 строк, используя индекс user_id. Что могло бы помочь мне в улучшении этого запроса, так это если бы он использовал множественный индекс, потому что тогда запрос был бы сужен до очень очень небольшого числа строк. Или, если я удаляю старые данные, тогда будет меньше строк до go до конца sh вычисления.

select  *
    from  `recent_activites`
    where  `id` > 20443580
      and  `user_id` = 20580
      and  `updated_at` > '2020-04-01 00:00:00'
      and  `type` in (?, ?, ?, ?, ?, ?, ?, ?, ?) ```

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

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

Для этого вам нужно настроить 2 соединения в вашей системе Laravel - создать новое соединение в config/database.php.

И теперь вы сможете получить доступ к своим архивным данным, например так:

$archive_data = DB::connection('name_of_archive_connection')->table('table_name')->select('*')...
$actual_data = DB::connection('name_of_main_connection')->table('table_name')->select('*')...

Также вы можете легко перемещать данные между базами данных, просто вставляя / удаляя функции mysql, как в примере выше.

0 голосов
/ 20 апреля 2020
  • При удалении такой большой части таблицы быстрее копировать строки, которые вы хотите сохранить.
  • Вам следует перейти от MyISAM к InnoDB.
  • PARTITIONing поможет в будущем очистить старые данные.
  • Добавление PARTITIONing будет стоить времени. Так будет любая техника для удаления старых данных. Что важнее? Минимизировать засорение? Или скорость выполнения задачи.
  • PARTITIONing, по сути, не ускорит запросы. Однако вам, похоже, нужен двумерный индекс.
  • Вы должны переосмыслить индексы при переходе к разбиению.
  • Сводная таблица может значительно повысить производительность.

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

Ссылки:

...