vMySQL的explain解释SQL执行计划,优化SQL执行和创建索引

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 这里举例说明如何查看MySQL的SQL执行计划,并根据执行计划创建索引。

这里举例说明如何查看MySQL的SQL执行计划,并根据执行计划创建索引。


mysql> explain  select count(*) from orders o , customer c where o.o_c_id=c.c_id and c_last='BARBARBAR' and c_first='YaWRXwdLu3Sq1';
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+----------+----------+-----------------------------------------------------------------+
| id | select_type | table | partitions | type  | possible_keys | key          | key_len | ref  | rows     | filtered | Extra                                                           |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+----------+----------+-----------------------------------------------------------------+
|  1 | SIMPLE      | c     | NULL       | index | NULL          | idx_customer | 137     | NULL |   277208 |     1.00 | Using where; Using index                                        |
|  1 | SIMPLE      | o     | NULL       | index | NULL          | idx_orders   | 12      | NULL | 24346812 |    10.00 | Using where; Using index; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+----------+----------+-----------------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)


使用show index from orders;和show index from customer;可以查看这些索引的定义。


列名 说明

id 执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置

select_type 显示本行是简单或复杂select。如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUlT)

table 访问引用哪个表(引用某个查询,如“derived3”)

type 数据访问/读取操作类型(ALL、index、range、ref、eq_ref、const/system、NULL)

possible_keys 揭示哪一些索引可能有利于高效的查找

key 显示mysql决定采用哪个索引来优化查询

key_len 显示mysql在索引里使用的字节数

ref 显示了之前的表在key列记录的索引中查找值所用的列或常量

rows 为了找到所需的行而需要读取的行数,估算值,不精确。通过把所有rows列值相乘,可粗略估算整个查询会检查的行数

filtered 显示过滤后的百分比

Extra 额外信息,如using index、filesort等

创建一个索引后的执行计划改变了:


mysql> create index cu_dx1 on customer(c_last,c_first);
Query OK, 0 rows affected (1.71 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> explain  select count(*) from orders o , customer c where o.o_c_id=c.c_id and c_last='BARBARBAR' and c_first='YaWRXwdLu3Sq1' 
    -> ;
+----+-------------+-------+------------+-------+---------------+------------+---------+-------------+----------+----------+-----------------------------------------------------------------+
| id | select_type | table | partitions | type  | possible_keys | key        | key_len | ref         | rows     | filtered | Extra                                                           |
+----+-------------+-------+------------+-------+---------------+------------+---------+-------------+----------+----------+-----------------------------------------------------------------+
|  1 | SIMPLE      | c     | NULL       | ref   | cu_dx1        | cu_dx1     | 134     | const,const |        1 |   100.00 | Using index                                                     |
|  1 | SIMPLE      | o     | NULL       | index | NULL          | idx_orders | 12      | NULL        | 24216188 |    10.00 | Using where; Using index; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------------+-------+---------------+------------+---------+-------------+----------+----------+-----------------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)


当我们把orders表上对应的index改成invisible后,我们看到执行计划走了全表扫描。


03:09:41pm> alter table orders alter index idx_orders invisible;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
03:11:02pm> explain  select count(*) from orders o , customer c where o.o_c_id=c.c_id and c_last='BARBARBAR' and c_first='YaWRXwdLu3Sq1';
+----+-------------+-------+------------+------+---------------+--------+---------+-------------+----------+----------+----------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key    | key_len | ref         | rows     | filtered | Extra                                              |
+----+-------------+-------+------------+------+---------------+--------+---------+-------------+----------+----------+----------------------------------------------------+
|  1 | SIMPLE      | c     | NULL       | ref  | cu_dx1        | cu_dx1 | 134     | const,const |        1 |   100.00 | Using index                                        |
|  1 | SIMPLE      | o     | NULL       | ALL  | NULL          | NULL   | NULL    | NULL        | 24216188 |    10.00 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------------+------+---------------+--------+---------+-------------+----------+----------+----------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
18天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
64 10
|
17天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
1月前
|
SQL 资源调度 分布式计算
如何让SQL跑快一点?(优化指南)
这篇文章主要探讨了如何在阿里云MaxCompute(原ODPS)平台上对SQL任务进行优化,特别是针对大数据处理和分析场景下的性能优化。
|
1月前
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
|
1月前
|
SQL 关系型数据库 MySQL
如何确认SQL用了索引:详细技巧与方法
在数据库管理中,索引是提高SQL查询性能的重要手段
|
1月前
|
SQL 监控 数据库
慢SQL对数据库写入性能的影响及优化技巧
在数据库管理系统中,慢SQL(即执行缓慢的SQL语句)不仅会影响查询性能,还可能对数据库的写入性能产生显著的不利影响
|
1月前
|
SQL 机器学习/深度学习 关系型数据库
最完整的Explain总结,SQL优化不再困难!
最完整的Explain总结,SQL优化不再困难!
|
1月前
|
SQL 关系型数据库 PostgreSQL
遇到SQL 子查询性能很差?其实可以这样优化
遇到SQL 子查询性能很差?其实可以这样优化
88 2
|
1月前
|
SQL 存储 关系型数据库
SQL默认索引是什么:深入解析与技巧
在SQL数据库中,索引是一种用于提高查询性能的重要数据结构