指定了线上环境时SOAR会到线上环境进行EXPLAIN,然后对线上执行EXPLAIN的结果进行分析。由于低版本的MySQL不支持对INSERT, UPDATE, DELETE, REPLACE进行分析,SOAR会自动将这些类型的查询请求转换为SELECT请求再执行EXPLAIN信息。
另外当线上环境设置了read_only或super_readonly时即使是高版本的MySQL也无法对更新请求执行EXPLAIN。需要进行SELECT转换。
SOAR也支持用户直接拷贝粘贴已有的EXPLAIN文本信息,格式可以是传统格式,\G输出的Verical格式,也可以是JSON格式。
JSON格式的EXPLAIN包含的内容很丰富,但不便于人查看,信息解读的时候会将JSON和Vertical格式统一转换成传统格式。Golang处理JSON格式需要提前定义结构体,这里不得不向gojson献出膝盖,要是没有这个工具也许我们暂时会放弃对JSON格式的支持。
表示此查询条件所过滤的数据的百分比。低版本的MySQL EXPLAIN信息不包含Filtered字段,SOAR会按 filtered = rows/total_rows
计算补充。
5.7之前的版本Filtered计算可能出现大于100%的BUG,为了不对用户产生困扰,soar会将大于100%的Filered化整为100%。
Scalability表示单表查询的运算复杂度,是参考explain-analyzer项目添加的。Scalability是对access_type的映射表,由于是单表查询,所以最大复杂度为O(n)。
Access Type | Scalability |
---|---|
ALL | O(n) |
index | O(n) |
range | O(log n)+ |
index_subquery | O(log n)+ |
unique_subquery | O(log n)+ |
index_merge | O(log n)+ |
ref_or_null | O(log n)+ |
fulltext | O(log n)+ |
ref | O(log n) |
eq_ref | O(log n) |
const | O(1) |
system | O(1) |