MySQL优化-EXPLAIN执行计划

在MySQL中可以使用EXPLAIN查看SQL执行计划。
本文章采用tb_item商品表、tb_order订单表、tb_user用户表作为例子。
查看sql的执行计划,例子如下:
EXPLAIN SELECT * FROM tb_item
在这里插入图片描述

EXPLAIN 结果说明

id

SELECT识别符。这是SELECT查询序列号。这个不重要。

select_type

表示SELECT语句的类型。

有以下几种值:
1、 SIMPLE
表示简单查询,其中不包含连接查询和子查询。
2、 PRIMARY
表示主查询,或者是最外面的查询语句。
在这里插入图片描述
3、 UNION
表示连接查询的第2个或后面的查询语句。
在这里插入图片描述
4、 DEPENDENT UNION
UNION中的第二个或后面的SELECT语句,取决于外面的查询。
5、 UNION RESULT
连接查询的结果。
6、 SUBQUERY
子查询中的第1个SELECT语句。
在这里插入图片描述
7、 DEPENDENT SUBQUERY
子查询中的第1个SELECT语句,取决于外面的查询。
8、 DERIVED
SELECT(FROM 子句的子查询)。

table

表示查询的表。

type(重要)

表示表的连接类型。
以下的连接类型的顺序是从最佳类型到最差类型:

1、 system
表仅有一行,这是const类型的特列,平时不会出现,这个也可以忽略不计。
2、 const
数据表最多只有一个匹配行,因为只匹配一行数据,所以很快,常用于PRIMARY KEY或者UNIQUE索引的查询,可理解为const是最优化的。
在这里插入图片描述
3、 eq_ref
mysql手册是这样说的:“对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY”。eq_ref可以用于使用=比较带索引的列。
在这里插入图片描述
4、 ref
查询条件索引既不是UNIQUE也不是PRIMARY KEY的情况。ref可用于=或<或>操作符的带索引的列。
在这里插入图片描述
5、 ref_or_null
该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。

上面这五种情况都是很理想的索引使用情况。

6、 index_merge
该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。
7、 unique_subquery
该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
8、 index_subquery
该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
9、 range
只检索给定范围的行,使用一个索引来选择行。
在这里插入图片描述
10、 index
该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
11、 ALL
对于每个来自于先前的表的行组合,进行完整的表扫描。(性能最差)

possible_keys

指出MySQL能使用哪个索引在该表中找到行。
如果该列为NULL,说明没有使用索引,可以对该列创建索引来提高性能。

key

显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。

可以强制使用索引或者忽略索引:
在这里插入图片描述

key_len

显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。

注意:key_len是确定了MySQL将实际使用的索引长度。

ref

显示使用哪个列或常数与key一起从表中选择行。

rows

显示MySQL认为它执行查询时必须检查的行数。

Extra

该列包含MySQL解决查询的详细信息
• Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
• Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
• range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
• Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。
• Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
• Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。
• Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
• Using sort_union(…), Using union(…), Using intersect(…):这些函数说明如何为index_merge联接类型合并索引扫描。
• Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。

索引查询

索引可以提供查询的速度,但并不是使用了带有索引的字段查询都会生效,有些情况下是不生效的,需要结合执行计划查看!

使用LIKE关键字的查询

在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不起作用。只有“%”不在第一个位置,索引才会生效。
在这里插入图片描述
在这里插入图片描述

使用联合索引的查询

MySQL可以为多个字段创建索引,一个索引可以包括16个字段。对于联合索引,只有查询条件中使用了这些字段中第一个字段时,索引才会生效。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用OR关键字的查询

查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,索引才会生效,否则,索引不生效。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
技术的变革,一定是思想先行,云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。云原生(CloudNative)是一个组合词,Cloud+Native。Cloud表示应用程序位于云中,而不是传统的数据中心;Native表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹性+分布式优势。云原生概括为4个要点:DevOps+持续交付+微服务+容器。符合云原生架构的应用程序应该是:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法、DevOps支持持续迭代和运维自动化,利用云平台设施实现弹性伸缩、动态调度、优化资源利用率。要转向云原生应用需要以新的云原生方法开展工作,云原生包括很多方面:基础架构服务、虚拟化、容器化、容器编排、微服务。本课程凝聚老师多年经验,基于真实工业界电商业务讲解,涉及多种技术落地方案,涉及多语言的协调开发,让学员在实战中熟悉云原生开发的全流程,感受云原生带来的开发便利。目前对云原生的人才需求也非常的大,谁尽早掌握,谁就能抓住这个风口,实现收入的增长。 本课程将分为3个阶段: 第一阶段:会基于云原生实现电商系统的大部分核心服务,包括:用户服务,商品服务,商品类目服务,商品属性服务,品牌服务,订单服务,网关服务等等。 第二阶段:基于云原生完成整个项目的持续集成,持续交付、持续部署,完成整个项目的自动化上云等等。  第三阶段: 进一步完善和优化电商系统,加入大数据,智能AI等等。  本课程包含的技术: IDEA集成开发工具 SpringBootSpringCloud SpringCloud AlibabaDevops MavenJenkinsCI/CD 持续集成 持续交付GitDocker Kubertenes 分布式系统微服务注册中心与配置中心:Nacos分布式系统微服务流量防卫兵:Sentinel分布式系统微服务网关:Gateway分布式系统微服务负载均衡:Feign分布式系统微服务链路追踪:Sleuth,Zipkin分布式系统微服务端点监控:spring boot adminSpringSecurity和JWT(认证和授权)消息中间件解决方案(RabbitMQ)MySQL(数据库)  MyCat MySQL分布式集群解决方案 Lucene、Elasticsearch(搜索) Nginx(web服务器)多语言(Go语言 Python语言 Java语言)CORS实现跨域 Swagger2 文档生成工具 Quartz分布式任务调度 Zookeeper Ehcache Restful VUE+jQuery+Ajax+NodeJS VUE+Element-UIGo+Gin 、 TensorFlow、RNN 、LSTM、Django、Spark大数据相关技术等等 课程亮点: 1.与企业无缝对接、工业界真实业务场景 2.集后端+前台+测试+运维一体,全面掌握技术链 3.多语言Java+Go+Python协调开发,属于语言应用场景4.支持项目快速迭代和开发 5.使用微服务技术栈+前后端分离构建项目 6.云上的开发体系,打造新一代研发平台7.引入全新的设计理念  8.集成SpringCloud Alibaba实现统一整合方案 9 Kubernetes+Docker容器化部署和管理 10 Devops全自动化持续集成和持续交付、部署11.TensorFlow、RNN 、LSTM综合应用12.动态扩展,弹性自动伸缩13.高并发下的服务降级、限流实战 14.实现高并发请求和实现高可用架构解决方案 15.引入大数据技术16.引入人工智能技术17.全程代码实操,提供课程代码和资料

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值