怎么找出最该优化的 SQL?按最慢排还是按总耗时排?应用侧统计与数据库侧统计各看到什么?这篇用同一组请求,把两边的榜单摆在一起对比。
次数 总耗时 ms 平均 ms 最大 ms 语句(截断) | 来自哪个端点
5 65.9 13.18 14.6 SELECT count(*) AS count_1 FROM "order" WHERE "order".note L | {'search': 5}
600 49.6 0.08 0.3 SELECT "order".amount FROM "order" WHERE "order".id = %(id_1 | {'report': 600}
40 8.3 0.21 1.0 SELECT "user".id, "user".name FROM "user" WHERE "user".id = | {'user': 40}
20 8.1 0.41 1.7 SELECT "order".id FROM "order" WHERE "order".user_id = %(use | {'report': 20}上一篇:请求耗时统计;下一篇:Flask Profiler。
第 96 篇讲过 SQLAlchemy 查询日志与慢查询事件,这一篇讲怎么聚合出榜单。
600 次 总 49.6 ms 平均 0.08 ms SELECT "order".amount FROM "order" WHERE "order".id = %(id_1)s::INTEGE
40 次 总 8.3 ms 平均 0.21 ms SELECT "user".id, "user".name FROM "user" WHERE "user".id = %(pk_1)s::
20 次 总 8.1 ms 平均 0.41 ms SELECT "order".id FROM "order" WHERE "order".user_id = %(user_id_1)s::calls | total ms | mean ms | max ms | 语句 5|64.5|12.897|14.2|SELECT count(*) AS count_1 FROM "order" WHERE "order".note LIKE $1::VA 20|4.6|0.228|1.4|SELECT "order".id FROM "order" WHERE "order".user_id = $1::INTEGER LIM 600|1.0|0.002|0.0|SELECT "order".amount FROM "order" WHERE "order".id = $1::INTEGER 40|0.4|0.009|0.0|SELECT "user".id, "user".name FROM "user" WHERE "user".id = $1::INTEGE 65|0.0|0.000|0.0|BEGIN (pg_stat_statements 把参数规整成 $1、$2,看的是数据库内部的执行时间,不含网络与 Python 的耗时;应用侧统计含这两部分)
pg_stat_statements 是自己起的 PostgreSQL 实例里启用的(shared_preload_libraries),不影响你自己的数据库。