Optimiza el rendimiento de la base de datos

Existen diferentes formas de mejorar el rendimiento de Firebase Realtime Database en tu app. Para descubrir lo que puedes hacer a fin de optimizar el rendimiento de Realtime Database, reúne datos a través de las diferentes herramientas de supervisión y, luego, haz cambios en el uso de tu app o de Realtime Database según corresponda.

Supervisa el rendimiento de Realtime Database

Para obtener datos sobre el rendimiento de Realtime Database, usa diferentes herramientas según el nivel de detalle que necesites:

  • Descripción general: Usa el generador de perfiles para ver una lista de consultas no indexadas y una descripción general en tiempo real de las operaciones de lectura y escritura.
  • Estimación del uso facturado: Aprovecha las métricas de uso disponibles en Firebase console para ver el uso facturado y las métricas de rendimiento de nivel superior.
  • Desglose detallado: Usa Cloud Monitoring para conocer con más detalle el rendimiento de tu base de datos en el tiempo.

Mejora el rendimiento por métrica

Una vez que reúnas los datos, revisa las siguientes estrategias y prácticas recomendadas según el área de rendimiento que deseas mejorar.

Resumen de estrategias para mejorar el rendimiento
Métrica Descripción Prácticas recomendadas
Carga/uso Optimiza cuánta capacidad de tu base de datos se usa para procesar solicitudes en un momento determinado (se refleja en las métricas **Load** o **io/database_load**). Optimiza tu estructura de datos
Fragmenta datos entre bases de datos
Mejora la eficiencia de los objetos de escucha
Usa reglas basadas en consultas para limitar las descargas
Optimiza las conexiones
Conexiones activas Equilibra la cantidad de conexiones activas simultáneas a tu base de datos para que se mantenga por debajo del límite de 200,000 conexiones. Fragmenta datos entre bases de datos
Reduce las conexiones nuevas
Ancho de banda saliente Si las descargas de tu base de datos son más que las deseadas, puedes mejorar la eficiencia de tus operaciones de lectura y reducir los gastos de funcionamiento de encriptación. Optimiza las conexiones
Optimiza tu estructura de datos
Usa reglas basadas en consultas para limitar las descargas
Vuelve a usar las sesiones de SSL
Mejora la eficiencia de los objetos de escucha
Restringe el acceso a los datos
Storage Asegúrate de no almacenar datos sin usar, o bien equilibra tus datos almacenados entre otras bases de datos o productos de Firebase para mantenerte debajo de la cuota. Borra datos sin usar
Optimiza la estructura de tus datos
Fragmenta datos entre bases de datos
Usa Cloud Storage para Firebase

Optimiza las conexiones

Las solicitudes RESTful como GET y PUT necesitan una conexión siempre, incluso si es breve. Estas conexiones frecuentes de corta duración en realidad pueden sumar una mayor cantidad de costos de conexión, carga de la base de datos y ancho de banda de salida que las conexiones activas en tiempo real a tu base de datos.

Cuando sea posible, usa los SDK nativos para la plataforma de tu app en lugar de la API de REST. Los SDK mantienen las conexiones abiertas, lo que reduce los costos de encriptación SSL y la carga de base de datos que pueden aumentar con la API de REST.

Si usas la API de REST, te recomendamos usar una conexión HTTP continua para mantener una conexión abierta o usar eventos enviados por el servidor, que pueden reducir los costos de los protocolos de enlace SSL.

Fragmenta los datos entre varias bases de datos

Dividir tus datos entre varias instancias de Realtime Database, lo que también se conoce como fragmentación de la base de datos, ofrece tres ventajas:

  1. Aumenta la cantidad total de conexiones activas simultáneas que se permiten en tu app, ya que las divide entre distintas instancias de bases de datos.
  2. Equilibra la carga entre distintas instancias de bases de datos.
  3. Si tienes grupos de usuarios independientes que solo necesitan acceso a conjuntos de datos discretos, usa diferentes instancias de bases de datos para aumentar el rendimiento y reducir la latencia.

Si tienes el plan de precios Blaze, puedes crear varias instancias de bases de datos dentro del mismo proyecto de Firebase y aprovechar un método común de autenticación de usuarios en varias instancias de bases de datos.

Obtén más información sobre cómo y cuándo fragmentar datos.

Crea estructuras de datos eficientes

Dado que Realtime Database recupera los datos de los nodos secundarios de una ruta y junto con la ruta, tiene sentido mantener una estructura de datos lo más simple posible. De esta manera, puedes recuperar los datos que necesitas de forma selectiva, sin tener que descargar datos innecesarios a los clientes.

En particular, ten en cuenta las operaciones de escritura y las eliminaciones cuando estructuras tus datos. Por ejemplo, borrar rutas con miles de divisiones puede ser costoso. Dividirlas en rutas con varios árboles secundarios y menos divisiones por nodo puede acelerar las eliminaciones.

Además, cada escritura puede consumir el 0.1% de tu uso total de la base de datos. Estructura tus datos de una manera que te permita procesar por lotes las escrituras en una sola operación como actualizaciones en varias rutas a través de los métodos update() en los SDK o solicitudes PATCH de RESTful.

Para optimizar la estructura de datos y mejorar el rendimiento, sigue las recomendaciones para las estructuras de datos.

Evita el acceso no autorizado

Evita las operaciones no autorizadas en tu base de datos con las reglas de seguridad de Realtime Database. Por ejemplo, usar reglas permite evitar una situación en la que un usuario malicioso descargue reiteradamente toda tu base de datos.

Obtén más información sobre el uso de las reglas de Firebase Realtime Database.

Usa reglas basadas en consultas para limitar las descargas

Las reglas de seguridad de Realtime Database restringen el acceso a la información de tu base de datos. Además, pueden usarse para limitar los datos que se obtienen a través de operaciones de lectura. Cuando usas reglas basadas en consultas, estas solo recuperan los datos que permite la regla, de conformidad con las definiciones en las expresiones de query., como query.limitToFirst.

Por ejemplo, la siguiente regla limita el acceso de lectura a los primeros 1,000 resultados de una consulta únicamente, los cuales se ordenan por prioridad:

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

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

Obtén más información sobre las reglas de seguridad de Realtime Database.

Indexa las consultas

Indexar tus datos reduce el ancho de banda total que usas en cada consulta que ejecuta tu app.

Vuelve a usar las sesiones de SSL

Envía solicitudes de sesión TLS para reducir los costos de funcionamiento de encriptación SSL. Esto es particularmente útil si necesitas conexiones frecuentes y seguras a la base de datos.

Mejora la eficiencia de los agentes de escucha

Ubica los agentes de escucha en una ruta de acceso lo más específica que puedas para limitar la cantidad de datos que sincronizan. Los agentes de escucha deben encontrarse cerca de los datos que quieres que obtengan. No uses objetos de escucha en la raíz de la base de datos, ya que esto genera descargas de la base de datos completa.

Agrega consultas para limitar los datos que muestran las operaciones de escucha y usa objetos de escucha que solo descarguen actualizaciones de los datos, por ejemplo, on() en lugar de once(). Reserva .once() para acciones que realmente no necesitan actualizaciones de datos. Además, ordena tus consultas con orderByKey(), cada vez que sea posible, para obtener el mejor rendimiento. Ordenar con orderByChild() puede ser entre 6 y 8 veces más lento, y ordenar con orderByValue() puede ser muy lento para los conjuntos de datos de gran tamaño, ya que necesita una lectura de toda la ubicación desde la capa de persistencia.

También asegúrate de agregar objetos de escucha de forma dinámica y quítalos cuando ya no sean necesarios.

Borra datos sin usar

Quita periódicamente los datos duplicados o sin usar de tu base de datos. Puedes ejecutar copias de seguridad para inspeccionar los datos de forma manual o crear una copia de seguridad en un bucket de Google Cloud Storage de forma periódica. Además, considera alojar los datos almacenados a través de Cloud Storage para Firebase.

Envía código escalable que puedas actualizar

Las apps compiladas en dispositivos de IoT deben incluir un código escalable que puedas actualizar con facilidad. Asegúrate de probar los casos prácticos, considerar escenarios en los que tu base de usuarios podría crecer de manera exponencial e incorporar la capacidad de implementar actualizaciones en tu código. Considera cuidadosamente los cambios importantes que podrías hacer después si, por ejemplo, decides fragmentar los datos.