慢查询日志按什么分组?
相同结构、不同参数的语句应记在一起。工具把单引号字符串、十进制数字和 0x 十六进制字面量换成 ?,再把 IN (?, ?, ?) 收成 IN (?),空白压成一个空格。这个结果称为 SQL 指纹。汇总按总 Query_time 从高到低排列,最多展示 50 条。
指纹不是数据库里的 digest。注释会被去掉,反引号标识符保留。它用来找重复出现的慢语句,不能代替 EXPLAIN。
能看出语句为什么慢吗?
日志里有耗时、锁等待、扫描行数、返回行数和 SQL 文本,没有优化器选择的索引。工具只用这些做推断:扫描行远大于返回行,表示读了很多行才得到少量结果;锁等待占单次耗时约三成及以上,表示时间主要花在等锁;同一指纹次数很多而单次很短,表示总耗时来自调用次数。
WHERE 里对列使用 YEAR、DATE、DATE_FORMAT 等函数,或 LIKE 模式以 % 开头时,会写出可以核对的改写。改写保持原来的筛选范围,不把两侧都是通配符的 LIKE 说成范围条件。看不出这类形态时,页面会写明需要对该语句执行 EXPLAIN。
支持哪些日志格式?
一条记录以 # Time: 或 # User@Host: 开始,并包含 # Query_time: 行。后面的 SQL 直到下一条记录为止。行首的 SET timestamp=... 和单独的 USE db; 不计入语句。# administrator command: 会跳过。
MySQL 5.6 及以后的文本慢日志、MariaDB 带相同四个计数字段的慢日志可以解析。不读取 performance_schema,也不登录数据库。文件超过 80MB 时不处理。
日志会上传吗?
不会。文件读取和文本解析都在当前页面完成,不向本站发送日志。