首页 > 数据库 >EXPLAIN分析SQL的执行计划

EXPLAIN分析SQL的执行计划

时间:2022-12-12 16:35:23浏览次数:57  
标签:ref EXPLAIN MySQL 查询 索引 SQL where 执行 type




通过EXPLAIN分析低效SQL的执行计划

可以通过EXPLAIN或者DESC命令获取MySQL如何实行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。

explain select *from myuser where loginname='2017'

id:1

select_type:SIMPLE

table:myuser

type :const

possible_keys:PRIMARY

key:PRIMARY

key_len:4

ref:const

row :1

extra

对于每个列简单地进行一下说明

id

select查询的序列号

select_type

select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。

table

输出的行所引用的表。

type

联合查询所使用的类型。

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext> ref_or_null > index_merge > unique_subquery > index_subquery >range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref。

type=ALL,全表扫描,MySQL遍历全表来找到匹配的行

type=index,索引全扫描,MySQL遍历整个索引来查询匹配的行

type=range,索引范围扫描,常见于<,<=,>,>=.between等操作

select * frompayment where customer_id >=300 and customer_id <=350

type=ref,使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行

select * frompayment where customer_id =350

type=eq_ref,类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配

type=const/system,单表中最多有一个匹配行,查询起来非常迅速,查询起来非常迅速,所以这个匹配行中的其他列的值可以被优化器在当前查询中当做常量来处理,例如,根据主键primary key或者唯一索引unique_index进行的查询。

type=NULL,MySQL不用访问表或者索引,直接就能够得到结果

select 1 from duanwhere 1

possible_keys

指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。

key

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

key_len

显示MySQL决定使用的键长度。如果键是NULL,长度就是NULL。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。

ref

显示哪个字段或常数与key一起被使用。

rows

这个数表示mysql要遍历多少数据才能找到,在innodb上是不准确的。

Extra

如果是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。

如果是where used,就是使用上了where限制。

如果是impossible where 表示用不着where,一般就是没查出来啥。

如果此信息显示Using filesort或者Using temporary的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。

 



标签:ref,EXPLAIN,MySQL,查询,索引,SQL,where,执行,type
From: https://blog.51cto.com/u_12026373/5930803

相关文章

  • SQLServer 计算运行时间
    1declare@ddatetime2set@d=getdate()3SELECT*FROM[TestDB].[dbo].[Test_Unit_History]//替换运行的语句4select[语句执行花费时间(毫秒)]=datediff(ms,@d......
  • 常用SQL的优化
    优化INSERT语句改写所有insertinto为insertdelayedintodelayed的含义是让insert语句马上执行,其实数据都被放在内存的队列中,并没有真正写入磁盘,这比每条语句分别插入要快......
  • mysql索引
    索引分类索引是在mysql的存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。mysql目前提供了......
  • pycharm链接数据库(MySQL)
    pycharm可以充当很多数据库的客户端点击MySQL后,如果是第一次使用pycharm中的MySQL,那么需要点击download下载对应驱动如果提示下载失败的话,可以点击Driver,选择MySQLfo......
  • Django链接MySQL
    Django链接MySQLdjango不能创建库,需要自己手动创建,并指定#默认用sqlite3DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','......
  • 《MySQL必知必会》之事务、用户权限、数据库维护和性能
    第二十六章管理事务处理本章介绍什么是事务处理以及如何利用COMMIT和ROLLBACK语句来管理事务处理事务处理并非所有数据库引擎都支持事务处理常用的InnoDB支持事务处......
  • 关于如何控制Ansible Playbook的执行顺序、运行选定的剧本资源的一些笔记
    写在前面和小伙伴们分享一些​​Ansible​​​中​​Playbook​​执行顺序控制的手段以及运行选定的任务的方法不知道小伙伴们有么有遇到这样的情况一些运维场景,​​Github......
  • MySQL与MariaDB核心特性比较详细版v1.0,Oracle ACE主编(覆盖mysql 8.0/mariadb 10.3,包括
    注:本文严禁任何形式的转载,原文使用word编写,为了大家阅读方便,提供pdf版下载。MySQL与MariaDB主要特性比较详细版v1.0(不含HA).pdf链接:https://pan.baidu.com/s/1qAcrxg8eRumRi3......
  • sql中查询语句如何让字符串转化数字方法
    错误方法:convert(int,字段名)或者 cast(字段名asint)函数对的,但是这样写完全错误!!!!!应该CONVERT(字段名,SIGNED)或者CAST(字段名ASSIGNEDinteger)例如:a、SELECTC......
  • [转]MySQL 中 Blob 和 Text 数据类型详解
    原文地址:https://mp.weixin.qq.com/s/SjaCSkcjT0rcO1n41RuEcA前言:前面文章我们介绍过一些常用数据类型的用法,比如int、char、varchar等。一直没详细介绍过blob及te......