Задать вопрос
Cyapa
@Cyapa

Как лучше спроектировать MySQL базу?

Приветствую, друзья. Я столкнулся с проблемой оптимизации одного из своих проектов, поэтому решил попросить совета у вас. Сначала вкратце опишу ситуацию:

Есть сервис позволяющий людям подавать заявки. Каждая заявка рассматривается (одобряется) автоматически, операция одобрения требует тяжелых выборок из БД (с изолированными транзакциями). Сейчас операция одобрения заявки происходит сразу по нажатию кнопки подачи заявки, делая тяжелую выборку каждый раз когда кто-то подает заявку.

Операция подачи заявки доступна через API, поэтому сервер бывает очень нагружен, когда работает софт. Сразу замечу, что если заявка одобрена, то она помещается в таблицу активных заявок, а софту выдается ее ID в этой таблице, через который и происходит дальнейший доступ к заявке. Если заявка не одобрена, то выдается причина по которой это произошло.

Немного подумав, я нашел идеальное (как мне казалось) решение - сделать пул заявок (отдельную MEMORY таблицу) и обрабатывать ее раз в несколько секунд. Это позволит сократить количество тяжеловесных выборок из БД.

На проверку, решение оказалось не таким уж и идеальным. Возникает ряд проблем: после подачи заявки нужно будет вернуть идентификатор по которому клиент сможет узнать статус заявки. Очевидное решение - ID заявки в пуле (MEMORY таблице). Но:

- как при таком подходе сохранить этот ID и для таблицы успешных заявок? Если присваивать успешным заявкам их временный ID, то в таблице успешных заявок будут просто огромные гэпсы, а это явно не хорошо.
- как оповестить клиента о причинах отказа в одобрении заявки, если после ее рассмотрения запись из временной таблицы будет удалена? Создавать таблицу для не одобренных заявок (или хранить их в таблице одобренных)? Это как-то не красиво, учитывая что не одобренных в сотни раз больше.

Буду рад услышать любые ваши мысли по изложенной проблеме. Спасибо.
  • Вопрос задан
  • 2379 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@asdz
А нельзя этот пул перенести в обычную таблицу, но работать с ней как с пулом? Пришла заявка - просто заносится в таблицу заявок, через некоторое время обработчик пула начинает работать с последними необработанными заявками занося результат их распределения в эту же таблицу. Результаты и id никуда не пропадают, соответственно вы можете в любой момент их использовать для оповещений.
Ответ написан
Сколько записей в базе, сколько поступает новых в день? "Тяжёлая" выборка - это сколько чего и откуда она тянет?
Ответ написан
alexclear
@alexclear
A cat
MEMORY хранилище в MySQL не работает нормально и никогда не работало нормально. Никаких преимуществ перед правильно настроенным InnoDB оно не дает: во-первых, оно не быстрее, во-вторых, в нем возможны только hash индексы и, как следствие, невозможны range scans. Еще там, кажется, построчных блокировок нет - но тут надо уточнять, я точно не помню.
Что именно Вы пытаетесь оптимизировать? Какой именно запрос? Вы пытались настраивать параметры InnoDB? Какие именно параметры и как настраивали?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы