You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy中.in_子句查询性能异常缓慢问题排查求助

问题:SQLAlchemy执行含IN子句的查询性能远低于MySQL Workbench

我使用SQLAlchemy编写了以下查询,用于统计符合条件的记录数量:

query = session.query(
                func.count(ExampleTable.id)
            ).filter(ExampleTable.environment == self.environment)
if ids_list:
    query = query.filter(ExampleTable.id.in_(ids_list))

执行时发现该查询速度缓慢,于是进行了简单的基准测试:

start = perf_counter()
query.first()
print(format(perf_counter() - start, '.3f'))  # 限制小数位数,仅用于调试

测试结果显示平均耗时约2.7秒。我曾怀疑是ExampleTable.environment == self.environment的字符串比较导致性能问题,但仅保留该条件时,平均耗时仅约0.03秒。

补充信息

  • ExampleTable总数据量约15万~20万条
  • ids_list包含22000个整数值

随后我将SQLAlchemy生成的查询(通过Query对象的__str__方法获取)在MySQL Workbench中执行:

SELECT 
    COUNT(example_table.id) AS count_1
FROM
    example_table
WHERE
    example_table.environment = 'production'
        AND example_table.id IN (775008, 790152, 793346, ...) -- 22k个ID

首次执行耗时0.110 sec / 0.000 sec(执行时长/获取时长),后续执行耗时约0.030 ~ 0.040 / 0.000。

仅执行环境过滤的查询:

SELECT
    COUNT(example_table.id) AS count_1 
FROM
    example_table 
WHERE
    example_table.environment = 'production';

首次执行耗时0.016 sec / 0.000 sec,后续执行耗时0.000 / 0.000。

明明执行的是相同查询,SQLAlchemy与Workbench的耗时差距却极大(2.7s vs 0.1s),我有两个疑问:

  1. 我在Python或MySQL的操作中是否存在错误?
  2. 若问题信息不足,请告知我需要补充的内容。

补充编辑:开启echo=True后,日志显示查询语句中的IN子句每个ID都对应一个独立参数(如%(id_1_1)s),参数字典中也为每个ID单独定义了键值。是否是这种参数处理方式导致了性能缓慢?


内容的提问来源于stack exchange,提问作者Jayme Klein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 22:40:07