博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Flask]sqlalchemy使用count()函数遇到的问题
阅读量:7081 次
发布时间:2019-06-28

本文共 1202 字,大约阅读时间需要 4 分钟。

sqlalchemy使用count()函数遇到的问题

在使用flask-sqlalchemy对一个千万级别表进行count操作时,出现了耗时严重、内存飙升的问题。

原代码:

# 统计当日登陆次数count = LoginLog.query.filter(LoginLog.username == username, LoginLog.status == 0, db.cast(LoginLog.time, db.DATE) == db.cast(datetime.utcnow(), db.DATE)).count()

sql打印:

SELECT    count(*) AS count_1FROM    (        SELECT            loginlog.id AS loginlog_id,            loginlog.username AS loginlog_username,            loginlog.time AS loginlog_time,            loginlog. STATUS AS loginlog_status        FROM            loginlog        WHERE            loginlog.username = % (username_1) s        AND loginlog. STATUS = % (status_1) s        AND CAST(loginlog.time AS DATE) = CAST(%(param_1) s AS DATE)    ) AS anon_1

进行了一次子查询,会生成临时表,效率低。

 

优化代码:

count = db.session.query(func.count(LoginLog.id)).filter(LoginLog.username == username, LoginLog.status == 0, db.cast(LoginLog.time, db.DATE) == db.cast(datetime.utcnow(), db.DATE)).scalar()

sql打印:

SELECT    count(loginlog.id) AS count_1FROM    loginlogWHERE    loginlog.username = % (username_1) sAND loginlog. STATUS = % (status_1) sAND CAST(loginlog.time AS DATE) = CAST(%(param_1) s AS DATE)

无子查询,效率高。

 

转载于:https://www.cnblogs.com/ttkl/p/11095227.html

你可能感兴趣的文章
不需要再手写 onSaveInstanceState 了,因为你的时间非常值钱
查看>>
SSL/TLS协议安全系列:CBC 模式的弱安全性介绍(一)
查看>>
几种通用防注入程序绕过方法
查看>>
Clickjacking简单介绍
查看>>
Android Tangram模型:手把手带你学习淘宝、天猫都在用的UI框架模型
查看>>
《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply
查看>>
Android TransactionTooLargeException 解析,思考与监控方案
查看>>
Android音频处理知识(一)MediaRecorder录制音频
查看>>
SpringBoot+Vue.js前后端分离实现大文件分块上传
查看>>
Node.js环境性能监控
查看>>
CSS在没有设置高度的情况下如何让同级元素高度相等?
查看>>
Elastic Stack学习--elasticsearch部署常见问题
查看>>
Oracle 手工清理临时段
查看>>
通过git远程管理自己本地的工程
查看>>
scala中的下划线_
查看>>
QTreeWidget 获取被双击的子项的层次路径
查看>>
如何调整工作激情
查看>>
数据仓库专题(10)-文本事实和杂项维度
查看>>
VC6下实现remove_reference的方法。
查看>>
数据备份和还原
查看>>