首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么SQLAlchemy计数()比原始查询慢得多?

为什么SQLAlchemy计数()比原始查询慢得多?
EN

Stack Overflow用户
提问于 2013-02-07 15:37:55
回答 3查看 81.2K关注 0票数 61

我使用SQLAlchemy和一个MySQL数据库,我想在一个表中计数行(大约300 K)。SQLAlchemy 计数函数运行的时间是直接在MySQL中写入相同查询的时间的50倍。我做错了什么吗?

代码语言:javascript
复制
# this takes over 3 seconds to return
session.query(Segment).count()

然而:

代码语言:javascript
复制
SELECT COUNT(*) FROM segments;
+----------+
| COUNT(*) |
+----------+
|   281992 |
+----------+
1 row in set (0.07 sec)

速度的差异随着表的大小而增加(在100 K行以下几乎不明显)。

更新

使用session.query(Segment.id).count()而不是session.query(Segment).count()似乎可以做到这一点,并使其达到速度。但是,我仍然很困惑,为什么初始的查询要慢一些。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-07 18:23:14

不幸的是,MySQL对子查询的支持非常糟糕,这对我们产生了非常负面的影响。SQLAlchemy文档指出,可以使用query(func.count(Segment.id))实现“优化”查询。

返回此查询将返回的行数。 这将生成此查询的SQL,如下所示: 选择count(1)作为count_1,从( SELECT )选择anon_1 若要对特定列进行细粒度控制以计数、跳过子查询的使用或FROM子句的其他控件,或使用其他聚合函数,请结合query()使用func表达式,即: 从sqlalchemy导入func #计数用户记录,而不使用子查询。从sqlalchemy导入session.query(func.count(User.id)) #用户"id“按”名称“session.query(func.count(User.id)).\ group_by(User.name)分组的返回计数

票数 89
EN

Stack Overflow用户

发布于 2017-12-13 20:38:15

原因是SQLAlchemy的count()正在计算子查询的结果,该子查询仍在进行全部工作以检索正在计算的行。这种行为与底层数据库无关;它不是MySQL的问题。

SQLAlchemy 文档解释了如何通过从sqlalchemy导入func来发出不带子查询的计数。

代码语言:javascript
复制
session.query(func.count(User.id)).scalar()

>>>SELECT count(users.id) AS count_1 \nFROM users')
票数 20
EN

Stack Overflow用户

发布于 2016-03-18 18:47:58

我花了很长时间才找到解决问题的办法。我得到了以下错误:

sqlalchemy.exc.DatabaseError:(mysql.connector.errors.DatabaseError) 126 (HY000):表‘/tmp/#sql_40ab_0.MYI’的不正确密钥文件;尝试修复它

当我更改以下内容时,问题得到了解决:

代码语言:javascript
复制
query = session.query(rumorClass).filter(rumorClass.exchangeDataState == state)
return query.count()

对此:

代码语言:javascript
复制
query = session.query(func.count(rumorClass.id)).filter(rumorClass.exchangeDataState == state)
return query.scalar()
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14754994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档