如何有效地从子查询中返回多个过滤后的计数

时间:2019-04-01 09:19:44

标签: sqlalchemy

我有一个约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万行的速度增长,因此问题只会变得更糟。任何帮助或建议都非常欢迎,非常感谢。

0 个答案:

没有答案