SQL、ORM 与数据库访问优化
Python 性能优化与高并发#Python全栈#第二十一阶段#Python 性能优化与高并发#SQL、ORM 与数据库访问优化约 876 字 · 3 分钟阅读
追问显示点击任意追问卡片可收起 / 展开
接口中的数据库耗时应该怎样拆分?
追问 连接等待、SQL 执行、结果传输、ORM 对象构造和序列化如何区分?SQL 本身很快,为什么应用侧仍可能花费大量时间?
怎样发现列表接口中的 N+1 查询问题?
追问 查询次数随返回条数增长时,怎样定位触发关联查询的字段?修复后除耗时外,还应验证查询次数、结果完整性与分页行为吗?
关联对象预加载应该怎样选择策略?
追问 JOIN 预加载与分批查询预加载分别有哪些成本?一对多关联中的行数膨胀、重复数据与分页限制怎样影响选择?
怎样使用 EXPLAIN 分析一条查询的访问方式?
追问 实际过滤条件、索引选择、扫描行数与排序怎样结合判断?估算与实际执行数据有什么区别,运行 EXPLAIN ANALYZE 前为什么要确认语句与环境?
查询使用了索引,为什么仍可能很慢?
追问 选择性低、范围过大、返回列多、排序与回表有哪些影响?怎样结合真实参数和数据分布判断,而不是只检查是否出现索引名称?
只查询必要字段,能减少哪些成本?
追问 数据库读取、网络传输、ORM 构造和响应序列化各能节省什么?延迟加载字段在后续被逐条访问时,如何避免重新形成大量查询?
深分页为什么可能越来越慢,游标分页适合什么场景?
追问 offset 扫描成本与基于排序键继续查询有什么区别?相同排序值、并发插入、删除和跳到指定页的需求怎样影响方案?
分页接口中的总数统计应怎样优化?
追问 是否每次请求都需要精确总数?返回下一页标志、缓存统计或异步统计时,怎样说明准确性与更新时效,避免悄悄改变接口约定?
批量写入为什么可能优于逐条提交,又有哪些代价?
追问 事务次数、网络往返、锁持有和失败范围怎样变化?ORM 批量接口与普通对象写入在事件、默认值、对象状态等方面应怎样核对?
怎样减少长事务对接口并发能力的影响?
追问 事务内等待外部 HTTP、执行慢计算或读取大结果集会占用什么资源?缩短事务后,怎样继续保证必要的原子性与一致性?
数据库优化核对资料: SQLAlchemy:Performance FAQ、MySQL 8.4:EXPLAIN。执行计划题以课堂实际数据库版本为准,基础要求是解释证据与优化理由。