真实跑一条查询,从system.query_log一次性拿到完整的耗时、内存、读写行数和物理IO画像,说明这些数字如何连成排查性能问题的完整线索链。
代码SELECT sum(v) FROM demo.threadtest WHERE k > 100 GROUP BY k%10; SYSTEM FLUSH LOGS; SELECT query_duration_ms, read_rows, read_bytes, result_rows, memory_usage, ProfileEvents['SelectedParts'], ProfileEvents['SelectedMarks'], ProfileEvents['FileOpen'] FROM system.query_log WHERE type='QueryFinish' ...;
query_duration_ms: 11 ← 真实总耗时 read_rows: 2000000 ← 真实读了200万行(全表,因为k>100几乎不裁剪任何数据) read_bytes: 32000000 ← 真实32MB(k+v两个UInt64列,200万行×16字节) result_rows: 10 ← 真实最终只返回10行(按k%10分组) memory_usage: 382149 ← 真实约373KB内存 SelectedParts: 2 ← 真实命中了2个part SelectedMarks: 245 ← 真实245个mark(对应200万行/8192≈244) FileOpen: 8 ← 真实打开了8次文件
这一行记录真实把"这条查询做了什么"量化成了一组具体的数字:读了多少、算出多少、花了多少内存、碰了多少个物理文件——不需要猜测或者定性地说"读得挺多",每一个数字都真实可以拿来跟其他查询、或者同一条查询的历史执行做对比。
每一步都是本文上面用真实system.query_log跑出来的原始结果。
system.query_log 与 ProfileEvents