Запрос в 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' )
...
...