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

Есть несколько различных способов улучшить производительность 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 bucket. Также рассмотрите возможность размещения сохраненных данных через Cloud Storage for Firebase .

Поставка масштабируемого кода, который можно обновлять

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