Actualmente estoy trabajando en el desarrollo de API con FastAPI.
La API es para obtener cierta cantidad de datos en una fecha específica de MariaDB.
Implementé esto usando Paginación FastAPI , pero tardó 9 segundos en obtener una respuesta.
¿Habría otras formas de mejorar el rendimiento?
Adjunto un poco de fondo a continuación:
http://localhost:8080/images/{date}?{page=N}&{size=M} (por ejemplo, http://localhost:8080/images/20211223?page=1&size=50)
La tabla tiene alrededor de 10 000 000 de filas y aquí hay algunas líneas de datos agregados. No hay índice en esta tabla, a partir de ahora. Si es necesario, ¡lo agregaría!
# get function part @router.get('/{stnd_ymd}', response_model=Page[ResponseImage]) async def get_images(stnd_ymd: str): image_list = Images.get_all(stnd_ymd=stnd_ymd, cnts_ty_cd="CT_IMAGE") return paginate(image_list) # about `get_all` function def get_all(cls, session: Session = None, **kwargs): sess = next(db.session()) if not session else session query = sess.query(cls) for key, val in kwargs.items(): col = getattr(cls, key) query = query.filter(col == val) result = query.all() if not session: sess.close() return resultSi hay alguna otra información necesaria, por favor dígame!
Gracias,
Como algunas personas señalaron en los comentarios, el tiempo de respuesta lento podría deberse a una consulta mal optimizada. Por ejemplo, en su método get_all al aplicar filtros para la consulta, siempre obtiene todas las columnas, lo que podría no ser la mejor práctica al obtener una cantidad tan grande de datos, así que intente obtener solo aquellas columnas que son necesarias para su interfaz/cliente en una vista específica. También creo que debe escribir su propia paginación personalizada realizada en el nivel de consulta (que será más rápido porque lo realiza la propia base de datos) porque tengo la sospecha de que la paginación fastapi solo pagina datos ya obtenidos previamente. Ejemplo de paginación usando SQLAlchemy:
offset = (page_number * items_count) - items_count filters = [ getattr(cls, column_name) == value for column_name, value in kwargs.items() ] query = query.where(*filters) result = query.offset(offset).limit(items_count).all()Intente usar fastapi-profiler cuando busque cuellos de botella de rendimiento en su código. Aquí hay una configuración simple que usé en uno de mis proyectos:
app.add_middleware( CProfileMiddleware, enable=True, print_each_request=True, strip_dirs=False, sort_by="cumtime" )¿Qué marco ORM usas? ¿Tortuga? ¿Alquimia SQL? Fastapi-pagination se integra con un montón de marcos
Entonces desea comprender qué consulta SQL se produce. Para esto, depuraría la solicitud y profundizaría en el código del marco ORM para encontrar un lugar donde se genera la consulta SQL. Por lo general, un simple step into depuración debería funcionar.
Algunos marcos ORM le permiten ver las consultas SQL registradas. Aquí hay una pregunta sobre el registro de consultas de SQLAlchemy .
Después de encontrar su consulta, desea probarla manualmente y ver qué puede mejorar. El comando ANALIZAR puede ser útil para obtener información sobre índices de tablas usados y otras cosas.