Запрос в sqlalchemy выполняется очень долго

Я изучаю flask,sqlalchemy. В качестве обучения я делаю веб мессенджер. На картинке часть модели баз данных. Я использую sqlite. Есть таблица сообщений, она связана с таблицей диалогов.Таблица диалогов связана с таблицей пользователей через association table.

Задача: Для конкретного пользователя я хочу получить последнее сообщение из каждого диалога, чтобы отобразить его в левой части экрана(так, как это работает в web.telegram.org). Для этого я написал запрос в left_messages().

Проблема в том, что он занимает очень много времени. Для тестирования я создал пользователя, добавил его в 300 диалогов, в каждый диалог добавил 1000 сообщений. В таком случае на моем компьютере запрос выполняется 0.5-1 секунду!

Что я делаю не так, как это можно ускорить?

association_table = db.Table('association_table',
    db.Column('dialog_id',db.Integer, db.ForeignKey('dialog.id'),index=True),
    db.Column('user_id',db.Integer, db.ForeignKey('user.id'),index=True),
    db.Column('unread', db.Integer, index=True))

class User(UserMixin,db.Model):
    id = db.Column(db.Integer, primary_key=True, index=True)
    username = db.Column(db.String(64), index=True, unique=True)
    ...
    ...
    def left_messages(self):
        return db.session.query(Message,association_table,func.max(Message.id)).join(
        association_table,(and_(
            association_table.c.user_id == self.id,\
                association_table.c.dialog_id == Message.dialog_id))).group_by(Message.dialog_id).all()
class Message(db.Model):
    id = db.Column(db.Integer, primary_key=True, index=True)
    dialog_id = db.Column(db.Integer, db.ForeignKey('dialog.id'),index=True)
    ...
    ...
class Dialog(db.Model):
    id = db.Column(db.Integer, primary_key=True, index=True)
    messages = db.relationship('Message', foreign_keys = 'Message.dialog_id', backref = 'dialog', lazy='dynamic')
    users = db.relationship(
    'User', secondary=association_table, backref=db.backref('dialogs', lazy='dynamic'), lazy='dynamic' )
    ...
    ...

Ответы (0 шт):