gpt4 book ai didi

mysql - 为什么 SQLAlchemy count() 比原始查询慢得多?

转载 作者:IT老高 更新时间:2023-10-28 13:00:25 31 4
gpt4 key购买 nike

我将 SQLAlchemy 与 MySQL 数据库一起使用,我想计算表中的行数(大约 300k)。 SQLAlchemy count函数的运行时间大约是直接在 MySQL 中编写相同查询的 50 倍。我做错了吗?

# this takes over 3 seconds to return
session.query(Segment).count()

但是:

SELECT COUNT(*) FROM segments;
+----------+
| COUNT(*) |
+----------+
| 281992 |
+----------+
1 row in set (0.07 sec)

速度差异随着表的大小而增加(在 100k 行下几乎看不到)。

更新

使用 session.query(Segment.id).count() 而不是 session.query(Segment).count() 似乎可以解决问题并得到它加快速度。我仍然不明白为什么初始查询速度较慢。

最佳答案

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

Return a count of rows this Query would return.

This generates the SQL for this Query as follows:

SELECT count(1) AS count_1 FROM (
SELECT <rest of query follows...> ) AS anon_1

For fine grained control over specific columns to count, to skip the usage of a subquery or otherwise control of the FROM clause, or to use other aggregate functions, use func expressions in conjunction with query(), i.e.:

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)))

关于mysql - 为什么 SQLAlchemy count() 比原始查询慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14754994/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com