explain.md 2.2 KB
Newer Older
martianzhang's avatar
martianzhang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

## EXPLAIN信息解读

* [EXPLAIN语法](https://dev.mysql.com/doc/refman/5.7/en/explain.html)
* [EXPLAIN输出信息](https://dev.mysql.com/doc/refman/5.7/en/explain-output.html)

### SELECT转换

指定了线上环境时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](https://github.com/ChimeraCoder/gojson)献出膝盖,要是没有这个工具也许我们暂时会放弃对JSON格式的支持。

### Filtered

表示此查询条件所过滤的数据的百分比。低版本的MySQL EXPLAIN信息不包含Filtered字段,SOAR会按 `filtered = rows/total_rows` 计算补充。

S
shesuyo 已提交
23
5.7之前的版本Filtered计算可能出现大于100%的[BUG](https://bugs.mysql.com/bug.php?id=34124),为了不对用户产生困扰,soar会将大于100%的Filered化整为100%。
martianzhang's avatar
martianzhang 已提交
24 25 26

### Scalability

S
shesuyo 已提交
27
Scalability表示单表查询的运算复杂度,是参考[explain-analyzer](https://github.com/Preetam/explain-analyzer)项目添加的。Scalability是对access\_type的映射表,由于是单表查询,所以最大复杂度为O(n)。
martianzhang's avatar
martianzhang 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

| 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)        |