mysql 数据库操作优化(navicat 解释)
Navicat中EXPLAIN语句分析SQL执行计划的关键指标包括:查询标识符(id)显示执行顺序,查询类型(select_type)区分简单/子查询等,表名(table)显示涉及表信息,连接类型(type)反映查询效率(从const到ALL递减),可能/实际使用的索引(possible_keys/key),索引使用长度(key_len),匹配值(ref),预估扫描行数(rows)以及额外信息(E
·
在 Navicat 中,执行 EXPLAIN 语句可以分析 SQL 查询的执行计划,帮助优化查询性能。以下是 Navicat 中 EXPLAIN 结果各列的详细解释:
1. id(查询标识符)
- 含义:查询的唯一标识符,标识 SQL 语句的执行顺序。
- 规则:
- id 相同:按
FROM、WHERE、GROUP BY等子句顺序执行。 - id 不同:id 值越大,优先级越高,越先执行。
- id 相同:按
2. select_type(查询类型)
- 常见值:
- SIMPLE:简单查询(不包含子查询或 UNION)。
- PRIMARY:主查询(包含子查询的外层查询)。
- SUBQUERY:子查询。
- DERIVED:派生表(FROM 子句中的子查询)。
- UNION:UNION 操作的第二个及后续查询。
3. table(表名)
- 含义:当前执行计划涉及的表名,可能是实际表名或别名。
- 特殊情况:
- <derivedN>:表示由 id=N 的子查询生成的临时表。
- <unionM,N>:表示 UNION 操作中 id=M 和 id=N 的结果合并。
4. type(连接类型,重要!)
-
含义:表示查询使用的索引类型,反映查询效率(从优到差):
- system:表中只有一行记录(系统表),是
const的特例。 - const:通过主键或唯一索引精确匹配一行记录(效率最高)。
- eq_ref:每行数据都通过主键或唯一索引与其他表连接。
- ref:使用非唯一索引或索引前缀匹配,返回多行数据。
- range:使用索引进行范围查询(如
WHERE id BETWEEN 1 AND 10)。 - index:全索引扫描(遍历整个索引树)。
- ALL:全表扫描(效率最低)。
- system:表中只有一行记录(系统表),是
-
优化目标:尽量将
type优化到ref或更高。
5. possible_keys(可能使用的索引)
- 含义:MySQL 认为可能用于执行查询的索引。
- 注意:即使显示了索引,也不代表实际会使用。
6. key(实际使用的索引)
- 含义:MySQL 实际选择的索引。
- 特殊值:
- NULL:未使用索引(可能是全表扫描)。
7. key_len(索引使用的字节数)
- 含义:表示索引使用的长度,反映索引的精确程度。
- 计算规则:
- 对于
VARCHAR(100)且CHARSET=utf8mb4:- 若索引覆盖整个字段,
key_len = 100 * 4 + 2 = 402(4 字节 / 字符 + 2 字节长度前缀)。 - 若索引只使用前 20 个字符,
key_len = 20 * 4 + 2 = 82。
- 若索引覆盖整个字段,
- 对于
8. ref(索引匹配的列或值)
- 含义:显示哪些列或常量被用于与索引匹配。
- 示例:
const:使用常量值匹配索引。table.column:使用其他表的列匹配索引。
9. rows(估计扫描的行数)
- 含义:MySQL 估计执行查询需要扫描的行数,非精确值。
- 作用:评估查询效率,值越小越好。
10.filtered (满足记录条数占比)
- 含义:满足当前索引条件的记录数 占 上一步操作扫描的记录数(即
rows值) 的百分比。 - 作用:评估查询效率,先看rows,rows一定的情况下,值越小越好。
11. Extra(额外信息,重要!)
- 常见值:
- Using index:使用覆盖索引(索引包含所有需要查询的字段),无需回表。
- Using where:使用 WHERE 子句过滤数据。
- Using filesort:需要文件排序(未利用索引排序),性能较差。
- Using temporary:使用临时表(如 GROUP BY 或 DISTINCT),性能开销大。
- Range checked for each record (index map: N):没有可用的索引,对每一行都要重新评估索引。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)