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),我有两个疑问:
- 我在Python或MySQL的操作中是否存在错误?
- 若问题信息不足,请告知我需要补充的内容。
补充编辑:开启echo=True后,日志显示查询语句中的IN子句每个ID都对应一个独立参数(如%(id_1_1)s),参数字典中也为每个ID单独定义了键值。是否是这种参数处理方式导致了性能缓慢?
内容的提问来源于stack exchange,提问作者Jayme Klein
相关产品推荐
相关产品推荐

