Mysql的执行计划explain

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Mysql的执行计划explain

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

使用方法,在select语句前加上explain就可以了:
如:explain select * from role

 

查询参数为2个,但索引只有其中一个,索引会不会起效果?

DROP TABLE IF EXISTS user;
CREATE TABLE user(
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(32) NOT NULL,
  nick_name VARCHAR(32) NOT NULL, 
  password VARCHAR(64) NOT NULL,
  email VARCHAR(50),
  last_pid VARCHAR(16) NOT NULL,
  role_id INT(11) NOT NULL,
  privileges TEXT NOT NULL,
  login_failed INT(11) DEFAULT 0,
  add_time TIMESTAMP NOT NULL DEFAULT '2000-01-01 00:00:00',
  modify_time TIMESTAMP NOT NULL DEFAULT '2000-01-01 00:00:00',
  last_login_ip varchar(50) not null default '127.0.0.1'
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

执行

mysql> explain select id from user where name='超级管理员';
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                                               |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Impossible WHERE noticed after reading const tables |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
1 row in set (0.00 sec)

发现是没有索引的结果

执行:

mysql> ALTER TABLE `user` ADD  INDEX IDX_NE (`name`);
mysql> explain select id from user where name='超级管理员';
+----+-------------+-------+------+---------------+--------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key    | key_len | ref   | rows | Extra                    |
+----+-------------+-------+------+---------------+--------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | user  | ref  | IDX_NE        | IDX_NE | 98      | const |    1 | Using where; Using index |
+----+-------------+-------+------+---------------+--------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)

发现有了索引后的结果

mysql> explain select id from user where name='超级管理员' and last_pid='last_pid';
+----+-------------+-------+------+---------------+--------+---------+-------+------+------------------------------------+
| id | select_type | table | type | possible_keys | key    | key_len | ref   | rows | Extra                              |
+----+-------------+-------+------+---------------+--------+---------+-------+------+------------------------------------+
|  1 | SIMPLE      | user  | ref  | IDX_NE        | IDX_NE | 98      | const |    1 | Using index condition; Using where |
+----+-------------+-------+------+---------------+--------+---------+-------+------+------------------------------------+
1 row in set (0.00 sec)

发现有两个参数,也能被提速,

反序也有效果

mysql> explain select id from user where last_pid='last_pid' and name='超级管理员' ;
+----+-------------+-------+------+---------------+--------+---------+-------+------+------------------------------------+
| id | select_type | table | type | possible_keys | key    | key_len | ref   | rows | Extra                              |
+----+-------------+-------+------+---------------+--------+---------+-------+------+------------------------------------+
|  1 | SIMPLE      | user  | ref  | IDX_NE        | IDX_NE | 98      | const |    1 | Using index condition; Using where |
+----+-------------+-------+------+---------------+--------+---------+-------+------+------------------------------------+
1 row in set (0.00 sec)

再加个索引:

mysql> ALTER TABLE `user` ADD  INDEX IDX_NE_PD (`name`,`last_pid`);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> explain select id from user where last_pid='last_pid' and name='超级管理员' ;
+----+-------------+-------+------+------------------+--------+---------+-------+------+------------------------------------+
| id | select_type | table | type | possible_keys    | key    | key_len | ref   | rows | Extra                              |
+----+-------------+-------+------+------------------+--------+---------+-------+------+------------------------------------+
|  1 | SIMPLE      | user  | ref  | IDX_NE,IDX_NE_PD | IDX_NE | 98      | const |    1 | Using index condition; Using where |
+----+-------------+-------+------+------------------+--------+---------+-------+------+------------------------------------+
1 row in set (0.00 sec)
mysql> explain select id from user where name='超级管理员' and last_pid='last_pid';
+----+-------------+-------+------+------------------+--------+---------+-------+------+------------------------------------+
| id | select_type | table | type | possible_keys    | key    | key_len | ref   | rows | Extra                              |
+----+-------------+-------+------+------------------+--------+---------+-------+------+------------------------------------+
|  1 | SIMPLE      | user  | ref  | IDX_NE,IDX_NE_PD | IDX_NE | 98      | const |    1 | Using index condition; Using where |
+----+-------------+-------+------+------------------+--------+---------+-------+------+------------------------------------+
1 row in set (0.00 sec)

都有效果

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
91 9
|
1月前
|
缓存 关系型数据库 MySQL
MySQL执行计划选择策略:揭秘查询优化的艺术
【10月更文挑战第15天】 在数据库性能优化中,选择最优的执行计划是提升查询效率的关键。MySQL作为一个强大的关系型数据库管理系统,提供了复杂的查询优化器来生成执行计划。本文将深入探讨如何选择合适的执行计划,以及为什么某些计划更优。
119 2
|
1月前
|
缓存 关系型数据库 MySQL
MySQL执行计划深度解析:如何做出最优选择
【10月更文挑战第23天】 在数据库查询性能优化中,执行计划的选择至关重要。MySQL通过查询优化器来生成执行计划,但有时不同的执行计划会导致性能差异。理解如何选择合适的执行计划,以及为什么某些计划更优,对于数据库管理员和开发者来说是一项必备技能。
113 2
|
1月前
|
SQL 关系型数据库 MySQL
美团面试:Mysql如何选择最优 执行计划,为什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴面试美团时遇到了关于MySQL执行计划的面试题:“MySQL如何选择最优执行计划,为什么?”由于缺乏系统化的准备,小伙伴未能给出满意的答案,面试失败。为此,尼恩为大家系统化地梳理了MySQL执行计划的相关知识,帮助大家提升技术水平,展示“技术肌肉”,让面试官“爱到不能自已”。相关内容已收录进《尼恩Java面试宝典PDF》V175版本,供大家参考学习。
|
2月前
|
SQL 关系型数据库 MySQL
MySQL EXPLAIN该如何分析?
本文将详细介绍MySQL中`EXPLAIN`关键字的工作原理及结果字段解析,帮助优化查询性能。`EXPLAIN`可显示查询SQL的执行计划,其结果包括`id`、`select_type`、`table`等字段。通过具体示例和优化建议,帮助你理解和应用`EXPLAIN`,提升数据库查询效率。
135 0
|
3月前
|
SQL 存储 关系型数据库
深入 MySQL 的执行计划与性能优化
深入 MySQL 的执行计划与性能优化
46 0
|
5月前
|
SQL 关系型数据库 MySQL
mysql性能调优:EXPLAIN命令21
【7月更文挑战第21天】掌握SQL性能调优:深入解析EXPLAIN命令的神奇用法!
65 1
|
5月前
|
SQL 缓存 关系型数据库
MySQL|浅谈explain的使用
【7月更文挑战第11天】
|
5月前
|
SQL 存储 数据库
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用