@Soniked

Как организовать умное кеширование MYSQL?

Добрый день
Есть таблица сообщений в бд mysql
В таблице более 2 миллионов записей, а так же 30+ столбцов
Так же, конечно есть индексация
Суммарный объем таблицы составляет более гигабайта. В пике нагрузки потребление памяти превышает 7 гигабайт, что довольно много

По таблице регулярно происходит поиск, однако задействованы зачастую последние 2-3 тысячи записей, изредка доходит до последних 100 тысяч, не более
Какие есть простые решения для оптимизации подобных таблиц? MYSQL FORCE и OPTIMIZE не особо помогают
На ум приходит только создание таблицы "старых сообщений", однако тогда придётся переписывать все взаимодействия с данными на стороне сервиса, что уже сразу делает решение "непростым". Так же читал про redis и подобные кеши, однако, насколько я понимаю, это так же потребует переделывания всей таблицы, вынос сообщений в отдельный сервис и переделка всего взаимодействия с таблицей

Что можете посоветовать?
  • Вопрос задан
  • 531 просмотр
Пригласить эксперта
Ответы на вопрос 3
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Как всегда, в заголовке одно, а в тексте вопроса совсем другое. И никакое кэширование автору делать на самом деле неохота - это же переделывать всё придется.

При этом чего именно нужно автору, из вопроса непонятно. То ли проблема с потреблением памяти, то ли скорость запросов, то ли вообще никаких проблем нет, а просто поговорить на с кем.

Ускорение запросов решается за счет создания индексов. Не "есть индексация", а конкретные осмысленные индексы для каждого используемого запроса. Если конкретный запрос тормозит, ему надо сделать explain, и на основе полученного результата подумать и реализовать индексы.
При этом нормально индексы работают только если все они помещаются в памяти. А это значит, что по поводу "7 гигов занято" надо не плакать а радоваться.
Существование "таблиц" для новых и старых сообщений в рамках одной таблицы - это партиционирование, например по дате. Но опять же, сначала надо определиться задачей, которую мы решаем.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Можно попробовать материализовать какие-то срезы главной таблицы для
быстрого извлечения информации. Классифицировать
оперативные типы запросов и для каждого класса создать материализованную view читать оттуда.
Структура mat-view может быть денормализованной например
CREATE TABLE mview1 (id varchar primary key, doc JSON);

Формат документа может быть произвольным но главное что он должен
собирать ровно те сведенья которые нужны для responce ни больше ни меньше.

По поводу быстрого извлечения 100 тысяч datarows из 2 млн. Это вызывает у меня
большое изумление. Для кого эта выборка? Человек-оператор не успеет прочитать
эти строки
за разумное время. А для фоновых задач типа jobs скорость отлика вообще
не важна. Особенно если джобы работают ночью например и еще и объединяются в пакет.

И если у вас идет неравномерный доступ к таблице то возможно имеет смысл разделить
ее на union из двух таблиц типа hot_data + historical_data. Это потребует переписывания
софта но зато у вас будет очень рациональное использование индексов. Они будут маленькие
и соотв. не будел вытеснения индексных страниц из кеша страниц.

Вот. Разделить можно по дате создания бизнес-факта или по другим вризнакам где есть date+time.
Ответ написан
Vapaamies
@Vapaamies
Психанул и снес свои ответы козлам, не отмечающим…
Суммарный объем таблицы составляет более гигабайта. В пике нагрузки потребление памяти превышает 7 гигабайт, что довольно много

Что можете посоветовать?

Начать использовать, наконец-то, связываемые переменные в запросах?
Ответ написан
Ваш ответ на вопрос

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

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