Оптимизация производительности базы данных

Есть несколько разных способов улучшить производительность Firebase Realtime Database в вашем приложении. Чтобы узнать, что вы можете сделать для оптимизации производительности Realtime Database , соберите данные с помощью различных инструментов мониторинга Realtime Database , а затем соответствующим образом внесите изменения в свое приложение или использование Realtime Database .

Мониторинг производительности Realtime Database

Вы можете собирать данные о производительности вашей Realtime Database с помощью нескольких различных инструментов, в зависимости от необходимого вам уровня детализации:

  • Общий обзор: используйте инструмент профилировщика для получения списка неиндексированных запросов и обзора операций чтения/записи в реальном времени.
  • Оценка использования по счетам. Используйте показатели использования , доступные в консоли Firebase чтобы просмотреть выставленные счета за использование и общие показатели производительности.
  • Подробная детализация: используйте Cloud Monitoring для более детального просмотра того, как ваша база данных работает с течением времени.

Повышение производительности по метрикам

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

Стратегии повышения производительности: краткий обзор
Метрика Описание Лучшие практики
Загрузка/использование Оптимизируйте, какая часть мощности вашей базы данных используется для обработки запросов в любой момент времени (отражено в метриках **Load** или **io/database_load**). Оптимизируйте структуру данных
Распределение данных по базам данных
Повысьте эффективность слушателей
Ограничьте загрузку с помощью правил на основе запросов
Оптимизация соединений
Активные соединения Сбалансируйте количество одновременных активных подключений к вашей базе данных, чтобы не превышать лимит в 200 000 подключений. Распределение данных по базам данных
Уменьшите количество новых связей
Исходящая полоса пропускания Если количество загрузок из вашей базы данных кажется выше, чем вам хотелось бы, вы можете повысить эффективность операций чтения и снизить затраты на шифрование. Оптимизация соединений
Оптимизируйте структуру данных
Ограничьте загрузку с помощью правил на основе запросов
Повторное использование сеансов SSL
Повысьте эффективность слушателей
Ограничить доступ к данным
Хранилище Убедитесь, что вы не храните неиспользуемые данные, и не распределяйте сохраненные данные по другим базам данных и/или продуктам Firebase, чтобы оставаться в пределах квоты. Очистите неиспользуемые данные
Оптимизируйте структуру данных
Распределение данных по базам данных
Используйте Cloud Storage for Firebase

Оптимизация соединений

Запросы RESTful, такие как GET и PUT по-прежнему требуют соединения, хотя это соединение недолговечно. Эти частые, кратковременные подключения могут фактически привести к значительно большему увеличению затрат на подключение, нагрузки на базу данных и исходящей пропускной способности, чем активные подключения к вашей базе данных в реальном времени.

По возможности используйте собственные SDK для платформы вашего приложения вместо REST API. Пакеты SDK поддерживают открытые соединения, сокращая затраты на SSL-шифрование и нагрузку на базу данных, которые могут возникнуть при использовании REST API.

Если вы используете REST API, рассмотрите возможность использования поддержки активности HTTP для поддержания открытого соединения или использования событий, отправляемых сервером , что может снизить затраты на подтверждение SSL.

Распределение данных по нескольким базам данных

Разделение ваших данных по нескольким экземплярам Realtime Database , также известное как сегментирование базы данных, дает три преимущества:

  1. Увеличьте общее количество одновременных активных подключений, разрешенных в вашем приложении, разделив их по экземплярам базы данных.
  2. Балансируйте нагрузку между экземплярами базы данных.
  3. Если у вас есть независимые группы пользователей, которым нужен доступ только к дискретным наборам данных, используйте разные экземпляры базы данных для более высокой пропускной способности и меньшей задержки.

Если вы используете тарифный план Blaze , вы можете создать несколько экземпляров базы данных в одном проекте Firebase, используя общий метод аутентификации пользователей для всех экземпляров базы данных.

Узнайте больше о том, как и когда сегментировать данные .

Создавайте эффективные структуры данных

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

В частности, рассмотрите возможность записи и удаления при структурировании данных. Например, удаление путей с тысячами листьев может оказаться дорогостоящим. Разделение их на пути с несколькими поддеревьями и меньшим количеством листьев на узел может ускорить удаление.

Кроме того, каждая запись может занимать 0,1% от общего использования базы данных. Структурируйте свои данные таким образом, чтобы вы могли группировать записи в одну операцию в виде многопутевых обновлений с помощью методов update() в SDK или запросов RESTful PATCH .

Чтобы оптимизировать структуру данных и повысить производительность, следуйте рекомендациям по работе со структурами данных .

Предотвратите несанкционированный доступ

Предотвратите несанкционированные операции с вашей базой данных с помощью Realtime Database Security Rules . Например, использование правил позволяет избежать сценария, при котором злоумышленник неоднократно загружает всю вашу базу данных.

Узнайте больше об использовании правил базы данных Firebase Realtime .

Используйте правила на основе запросов для ограничения загрузок.

Realtime Database Security Rules ограничивают доступ к данным в вашей базе данных, но они также могут служить ограничениями на данные, возвращаемые в ходе операций чтения. Когда вы используете правила на основе запроса, определенные в query. выражения типа query.limitToFirst запросы извлекают только данные, ограниченные правилом.

Например, следующее правило ограничивает доступ для чтения только к первым 1000 результатам запроса, упорядоченным по приоритету:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

Узнайте больше о Realtime Database Security Rules .

Индексные запросы

Индексирование ваших данных снижает общую пропускную способность, используемую для каждого запроса, выполняемого вашим приложением.

Повторное использование сеансов SSL

Сократите накладные расходы на SSL-шифрование при возобновлении соединений, выпустив билеты сеанса TLS . Это особенно полезно, если вам требуются частые и безопасные подключения к базе данных.

Повысьте эффективность слушателей

Разместите слушателей как можно дальше по пути, чтобы ограничить объем данных, которые они синхронизируют. Ваши слушатели должны быть близки к тем данным, которые вы хотите, чтобы они получили. Не прослушивайте корень базы данных, так как это приведет к загрузке всей базы данных.

Добавьте запросы, чтобы ограничить объем данных, возвращаемых вашими операциями прослушивания, и используйте прослушиватели, которые загружают только обновления данных — например, on() вместо once() . Зарезервируйте .once() для действий, которые действительно не требуют обновления данных. Кроме того, по возможности сортируйте запросы с помощью orderByKey() для достижения наилучшей производительности. Сортировка с помощью orderByChild() может быть в 6-8 раз медленнее, а сортировка с помощью orderByValue() может быть очень медленной для больших наборов данных, поскольку требует чтения всего местоположения из уровня персистентности.

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

Очистите неиспользуемые данные

Периодически удаляйте неиспользуемые или повторяющиеся данные из вашей базы данных. Вы можете запускать резервное копирование , чтобы вручную проверять свои данные или периодически создавать их резервные копии в хранилище Google Cloud Storage . Также рассмотрите возможность размещения хранимых данных через Cloud Storage for Firebase .

Отправьте масштабируемый код, который вы можете обновить.

Приложения, встроенные в устройства Интернета вещей, должны включать масштабируемый код, который можно легко обновлять. Обязательно тщательно протестируйте варианты использования, учтите сценарии, в которых ваша пользовательская база может расти в геометрической прогрессии, и предусмотрите возможность развертывания обновлений для вашего кода. Тщательно продумайте основные изменения, которые вам, возможно, придется внести в дальнейшем, если, например, вы решите сегментировать свои данные.