mysql SQL执行计划分析的时候,要关注哪些信息?
1 个回答
自己喜欢的东西又何必问别人好不好小王子-B612### 执行计划字段介绍 1. **id**:每个操作的唯一标识符。在多表 `JOIN` 时,多个记录的 `id` 值可能相同,表示这些记录属于同一查询。 2. **select_type**:查询类型(如 `SIMPLE`、`PRIMARY`、`SUBQUERY`、`UNION` 等),影响查询的执行方式。 3. **table**:当前操作涉及的表。 4. **partitions**:所涉及的分区。 5. **type**:查询所使用的访问类型,按效率从高到低排序为:`system` > `const` > `eq_ref` > `ref` > `range` > `index` > `ALL`。 6. **possible_keys**:查询优化器可能使用的索引。 7. **key**:优化器实际选择的索引。 8. **key_len**:索引的长度,长度越短通常效率越高。 9. **ref**:表示哪些列或常量用于与索引列比较。 10. **rows**:估计扫描的行数,越少越好。 11. **filtered**:表示过滤后保留的行比例,值越大越好。 12. **Extra**:描述 MySQL 执行查询时的附加操作。 ### 关键字段说明 - **type**:用于判断查询的访问类型,类型越靠前效率越高。 - `system`:系统表(最小的数据量)。 - `const`:常数索引,针对唯一值查询。 - `eq_ref`:唯一索引扫描,仅扫描一行。 - `ref`:非唯一索引扫描,仅扫描部分行。 - `range`:范围扫描,查询索引的一个范围。 - `index`:全索引扫描,遍历整个索引。 - `ALL`:全表扫描。 - **possible_keys 和 key**:`possible_keys` 列出可能使用的索引,但不一定使用;`key` 表示实际使用的索引。 - **Extra**:提供了 MySQL 执行查询时的额外信息。 - `Using where`:检索后进行条件过滤。 - `Using index`:覆盖索引,避免回表。 - `Using index condition`:使用索引下推。 - `Using join buffer`:使用连接缓存。 - `Using temporary`:创建临时表,多用于排序和分组。 - `Using filesort`:无法使用索引进行排序时的文件排序。 ### 常见执行情况示例 - **情况一**:`type=index`,`key=idx_abc`,`extra=Using where; Using index`。表示用联合索引查询,但未遵守最左前缀匹配,效率一般。 - **情况二**:`type=ref`,`key=idx_abc`,表示查询用到了非唯一索引。 - **情况三**:`type=const`,`key=f`,使用了唯一索引查询。 - **情况四**:`type=ref`,`key=idx_abc`,`extra=Using index`,用到了覆盖索引,避免回表。 - **情况五**:`type=ALL`,`key=NULL`,没有用到索引。 这些信息有助于评估 SQL 的性能,识别并优化查询中的潜在瓶颈。发布于 2024-11-07 05:49 •IP属地 江西举报评论收藏
公众号进入网站体验更佳

