Mysql的执行计划explain

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 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)

都有效果

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
SQL 存储 关系型数据库
SQL优化之Explain详解(mysql)
`Explain`是MySQL中用于分析SQL查询执行计划的工具。它可以帮助我们了解MySQL如何执行SQL语句,包括如何使用索引、预计的行数以及查询的顺序。以下是`Explain`输出的关键列及其含义的简要摘要: 1. **id**:查询的序列号,表示查询中的子句层次,id越大优先级越高。 2. **select_type**:表示查询的类型,如SIMPLE(简单查询)、PRIMARY(主查询,多表查询中的第一个查询)、SUBQUERY(子查询)、DERIVED(派生表)或UNION(UNION操作的查询部分)。 3. **table**:查询涉及的表名,如果是子查询,可能显示为衍生表
69 0
|
2月前
|
SQL 关系型数据库 MySQL
mysql性能调优:EXPLAIN命令21
【7月更文挑战第21天】掌握SQL性能调优:深入解析EXPLAIN命令的神奇用法!
40 1
|
2月前
|
SQL 缓存 关系型数据库
MySQL|浅谈explain的使用
【7月更文挑战第11天】
|
2月前
|
SQL 存储 数据库
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
|
2月前
|
SQL 索引 关系型数据库
MySQL设计规约问题之为什么推荐使用EXPLAIN来检查SQL查询
MySQL设计规约问题之为什么推荐使用EXPLAIN来检查SQL查询
|
3月前
|
SQL 关系型数据库 MySQL
【Mysql】 深入理解MySQL的执行计划
【Mysql】 深入理解MySQL的执行计划
139 4
|
3月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
47 2
|
3月前
|
SQL 存储 关系型数据库
MySQL的查询计划(EXPLAIN)
MySQL的查询计划(EXPLAIN)
47 2
|
4月前
|
存储 SQL 关系型数据库
MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用
MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用
61 0