#mysql #node.js #amazon-web-services #amazon-rds
Вопрос:
Таким образом, на нашем веб-сайте растет объем данных, и мы обычно используем представления mysql для списков записей, чтобы упростить запрос select в наших кодах. С тех пор это стало практикой, но со временем требования ввели множество сложностей в представления SQL, таких как сумма, количество и т. Д. Таким образом, большинство наших взглядов относительно медленнее.
Чтобы сохранить логику, созданную в представлениях MySQL (поскольку это предпочтения нашего клиента), мы попробовали следующее:
Вариант 1 заключается в том, чтобы:
- Раскрутил RDS 2
- Выберите * из списка на нашем RDS 1
- Вставьте во все результаты в RDS 2
- Подключите API списков для извлечения данных из RDS 2
С #4 он возвращается быстро, потому что база данных больше не будет повторно оценивать сумму, подсчитывать, нам просто нужно получить результат. #2 amp; #3:
- Наш сервер API работает под управлением nodejs, и он подключается к этим 2 базам данных.
- Я сохраняю только 1000 на список/таблицу. Итак, если у меня 6 представлений = создается 6 плоских таблиц.
- Такое случается по крайней мере каждую минуту. Мы внедрили флаг, чтобы проверить, идет ли процесс, прежде чем повторять весь процесс.
Проблема с этой опцией: это напрягает наш сервер RDS 1 и API.
Вариант 2 заключается в том, чтобы:
- Создайте другую таблицу на том же RDS 1
- Вставить в представление выбрать из sql
- Подключите API списка для извлечения данных из созданной плоской таблицы
Проблема с этой опцией: я не тестировал ее в наших тестовых средах, но в моей локальной среде, когда выполняется #2, обновление некоторых строк таблицы невозможно, и я получаю ошибки взаимоблокировки.
Не уверен, нахожусь ли я на правильном пути, или у этого даже есть решение помимо перекодирования или исправления структуры нашей базы данных или полного отказа от использования представлений MySQL.
Заранее спасибо.
Комментарии:
1. Похоже, вам нужен какой-то кэш, а не 2-я база данных или таблица.
2. Да, как редис. Затем мне просто нужно запустить еще один считыватель реплик, чтобы я мог перенаправить весь запрос select на него и не влиять на другие транзакции…
Ответ №1:
«сумма, количество и т. Д.» — Это похоже на «отчет» по сравнению с большой таблицей «Фактов» в хранилище данных.
План А-Сводные таблицы
Если данные статичны (после их вставки), то создавайте и поддерживайте сводные таблицы. Это будет намного быстрее и эффективнее во всем. Вы все еще можете поставить VIEW
или Stored Proc
перед нужными «выборками».
Такие сводные таблицы будут храниться в одном экземпляре и могут занимать всего 20% дополнительного дискового пространства. И, поскольку они работают намного быстрее, нет необходимости настраивать другой сервер. http://mysql.rjweb.org/doc.php/summarytables
VIEWs
являются синтаксическим сахаром. Они никогда(?) не быстрее , чем базовые SELECT
, а иногда и медленнее. Они, как говорит ваш клиент, облегчают запросы.
План Б — Репликация
Другой подход к обработке слишком большого количества запросов (в отличие от обработки медленных запросов) заключается в использовании «репликации». Записи отправляются в Первичный файл и реплицируются в реплики. Вы VIEWs
можете попасть в реплики, так как они (я предполагаю) доступны только для чтения. Можно добавить любое количество реплик, что приведет к «бесконечному» масштабированию.
(И A, и B можно сделать.)
Комментарии:
1. План А — да, это было предложено, но это будет означать, что мы собираемся обновить сводные таблицы на большинстве страниц, которые влияют на сводную таблицу. План Б — у нашего RDS в Авроре в настоящее время есть копия писателя и читателя. Клиент готов потратить деньги на обновление, но не футуристично, потому что это не экономически выгодно.
2. @JanLmpn — Расскажите подробнее о том, как вы представляете сводные таблицы. Я реализовывал их несколько раз-с очень небольшими накладными расходами.