我有一个约500万行的表,用于存储每个用户的固件下载。我正在尝试建立过去30天内特定固件文件下载数量的图表。
尽管我可以填充数据,但是从数据库中查询数据的速度很慢,因为我为每个结果调用一次。我还猜测在每个匹配日进行firmware_id
之前,子查询会更快地“预过滤” COUNT
。
model.py的定义是:
class Client(db.Model):
__tablename__ = 'clients'
id = Column(Integer, primary_key=True, nullable=False, unique=True)
datestr = Column(Integer, default=0, index=True)
firmware_id = Column(Integer, ForeignKey('firmware.firmware_id'), nullable=False, index=True)
datestr
是带有当前yyyymmdd的整数,例如20190101。
我当前的操作方式是:
data = []
now = datetime.date.today()
for _ in range(30):
datestr = _get_datestr_from_datetime(now)
total = _execute_count_star(db.session.query(Client).\
filter(Client.firmware_id == fw.firmware_id).\
filter(Client.datestr == datestr))
data.append(int(total))
now -= datetime.timedelta(days=1)
其中_execute_count_star
的定义(似乎比.count()
快得多)为:
def _execute_count_star(q):
count_query = q.statement.with_only_columns([func.count()]).order_by(None)
return q.session.execute(count_query).scalar()
理想情况下,我想在一个查询中返回当天的所有30个结果(使用子查询对firmware_id
进行过滤?);目前,填充数据大约需要3秒钟的时间,默认情况下,该数据太长而无法显示给用户。此外,该表预计将以每月50万行的速度增长,因此问题只会变得更糟。任何帮助或建议都非常欢迎,非常感谢。