我正在使用 SQLAlchemy 和 MySQL 数据库,我想计算表中的行数(大约 300k)。 SQL炼金术count http://docs.sqlalchemy.org/ru/latest/orm/query.html#sqlalchemy.orm.query.Query.count运行该函数所需的时间大约是直接在 MySQL 中编写相同查询的 50 倍。难道我做错了什么?
# this takes over 3 seconds to return
session.query(Segment).count()
However:
SELECT COUNT(*) FROM segments;
+----------+
| COUNT(*) |
+----------+
| 281992 |
+----------+
1 row in set (0.07 sec)
速度差异随着表的大小而增加(在 100k 行下几乎不明显)。
Update
Using session.query(Segment.id).count()
代替session.query(Segment).count()
似乎可以解决问题并加快速度。我仍然很困惑为什么初始查询速度较慢。
不幸的是,MySQL 对子查询的支持非常非常糟糕,这对我们产生了非常负面的影响。这SQLAlchemy 文档 http://docs.sqlalchemy.org/en/rel_0_8/orm/query.html?highlight=count#sqlalchemy.orm.query.Query.count指出可以使用以下方式实现“优化”查询query(func.count(Segment.id))
:
返回此查询将返回的行数。
这会生成此查询的 SQL,如下所示:
SELECT count(1) AS count_1 FROM (
SELECT <rest of query follows...> ) AS anon_1
要对要计数的特定列进行细粒度控制,请跳过
使用子查询或以其他方式控制 FROM 子句,或者使用
其他聚合函数,结合使用 func 表达式
查询(),即:
from sqlalchemy import func
# count User records, without
# using a subquery.
session.query(func.count(User.id))
# return count of user "id" grouped
# by "name"
session.query(func.count(User.id)).\
group_by(User.name)
from sqlalchemy import distinct
# count distinct "name" values
session.query(func.count(distinct(User.name)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)