SQLAlchemy中高效检查用户ID是否存在的最优性能方案
SQLAlchemy批量/单个检查用户ID存在性的最优性能方案
当前实现的问题
你现在循环调用Merchant.get(left_id)(应该是笔误,实际应为Users.get(id)),这种写法会对列表里的每个ID发起一次数据库查询,属于N次数据库往返,数据量大时性能会非常差,完全没必要。
批量检查user_id是否存在的最优方法
直接用IN查询,仅发起一次数据库请求获取所有存在的user_id,再和原列表对比:
from sqlalchemy import select user_ids_list = [1, 2, 3, 999] # 一次查询拿到所有已存在的user_id existing_ids = session.execute( select(Users.user_id).where(Users.user_id.in_(user_ids_list)) ).scalars().all() # 转成集合,提升存在性判断效率 existing_ids_set = set(existing_ids) # 筛选原列表中真实存在的ID validated_user_ids = [id for id in user_ids_list if id in existing_ids_set]
这种方案的优势:
- 仅需1次数据库往返,彻底避免N次查询的网络开销
user_id是主键,自带唯一索引,IN查询在索引列上的执行效率极高- 集合的存在性判断时间复杂度为O(1),比遍历列表快得多
单个检查user_id是否存在的最优方法
直接用SQLAlchemy的get()方法:
target_id = 1 # 检查单个ID是否存在 exists = session.get(Users, target_id) is not None
也可以用更显式的查询写法:
exists = session.query(Users.user_id).filter_by(user_id=target_id).first() is not None
get()方法的优势:
- 基于主键直接查询,生成的SQL为
SELECT ... WHERE user_id = ?,利用主键索引达到最快查询速度 - 如果该对象已在会话缓存中,会直接返回缓存数据,无需发起数据库请求
内容的提问来源于stack exchange,提问作者Viet Than
相关产品推荐
相关产品推荐

