大家好,如果您还对mysql解释用法介绍和结果含义有什么好处?不太了解,没有关系,今天就由本站为大家分享mysql解释用法介绍和结果含义有什么好处?的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
使用时只需在select语句前添加explain即可,如:
解释select * from statuses_status where id=11;创建测试表:
CREATE TABLE people( id int auto_increment 主键,邮政编码char(32) not null default '',地址varchar(128) not null default '',lastname char(64) not null default '',firstname char(64) not null默认'',出生日期char(10) not null default '');创建表people_car( people_id int,plate_number varchar(16) not null default '',engine_number varchar(16) not null default '',上次时间戳);插入测试数据:
insert into people(zipcode,address,lastname,firstname,birthdate)values('230031','安徽','zhan','jindong','1989-09-15'),('100000','北京', 'zhang','san','1987-03-11'),('200000','上海','王','吴','1988-08-25')插入people_car(people_id,plate_number, engine_number,lasttime)values(1,'A121311','12121313','2013-11-23 :21:12:21'),(2,'B121311','1S121313','2011-11-23 :21:123336 021'),(3 , 'C121311','1211SAS1','2012-11-23 :21:12:21') 创建索引用于测试
更改表人们添加索引(邮政编码,名字,姓氏);
explain介绍
让我们从最简单的查询开始:
Query-1解释从人员中选择邮政编码、名字、姓氏;
解释输出结果包括id、select_type、table、type、possible_keys、key、key_len、ref、rows 和Extra columns。每一列的含义是什么?请看下面的解释。
select_type 表示查询中每个select 语句的类型(简单或复杂),可以是以下形式:
a.SIMPLE:最简单的SELECT查询,不使用UNION或子查询,参见Query-1。
b.PRIMARY:嵌套查询中最外层的SELECT 语句,UNION 查询中最前面的SELECT 语句。请参阅查询2 和查询3。
如果查询包含任何复杂的子部分,则最外面的查询被标记为:PRIMARY
Query-2explain select zipcode from (select * from people a) b;
Query-3解释select * from people where zipcode=100000 union select * from people where zipcode=200000;
c.UNION:UNION 中的第二个及后续SELECT 语句。请参阅查询3。
d.DERIVED:派生表SELECT 语句的FROM 子句中的SELECT 语句。请参阅查询2。
e.UNION RESULT:UNION 查询的结果。请参阅查询3。
g.SUBQUERY:子查询中的第一个SELECT 语句。
Query-6explain select * from people where id=(select id from people where zipcode=100000);
table:显示的该行信息是指哪个表。有时它不是真正的表名。
Query-7解释select * from (select * from (select * from people a) b ) c;
如果指定了别名,您可以看到显示的别名。
衍生NN是id值,指的是id值对应的运算的结果。
还有unionM、N等类型出现在UNION语句中,参见Query-4。
注意:MySQL 将这些表视为普通表,但这些“临时表”没有任何索引。
类型
类型栏非常重要。用于说明表之间如何进行关联操作以及是否使用索引。 MySQL中的“关联”一词比一般含义更广泛。 MySQL 将任何查询视为“关联”。不只是查询需要两张表才能称为关联,所以你还可以了解MySQL是如何访问表的。的。主要有以下几类。
常量
当确定最多有一行匹配时,MySQL优化器会在查询之前读取它,并且只读取一次,因此速度非常快。 const 仅在将常量与主键或唯一索引进行比较时使用,并且比较所有索引字段。 people 表有一个关于id 的主键索引和一个关于(邮政编码、名字、姓氏)的辅助索引。因此Query-8 的类型是const,但Query-9 不是:
Query-8解释从id=1 的人中选择*;
Query-9explain select * from people where zipcode=100000;
请注意,以下Query-10 不能使用const 表。虽然也是主键,但是只会返回一个结果。
Query-10解释select * from people where id 2;
系统
这是const连接类型的一种特殊情况,表中只有一行满足条件。
Query-11解释select * from (select * from people where id=1 )b;
衍生2已经是一个常量表并且只有一条记录。
等式引用
唯一索引扫描,对于每个索引键,表中只有一条记录与其匹配。常见于主键或唯一索引扫描。 eq_ref 类型是除const 之外最好的连接类型。
创建员工表员工和经理表Manager
创建表Employee( ID int auto_increment, Ename varchar(32), Age int, Salary float, MID int, 主键(ID));创建表管理器( MID int, 名称varchar(32), 主键(MID)); Query-12解释select * from Employee A,Manager B where A.MID=B.MID;
MID对于表Manager来说是唯一的,是用来连接employee的主键索引,所以类型是eq_ref。
参考
非唯一索引扫描,返回与单个值匹配的所有行。常见于使用非唯一索引的搜索,即唯一索引的非唯一前缀。
该类型与eq_ref的区别在于,它用在关联操作中,只使用索引最左边的前缀,或者索引不是UNIQUE和PRIMARY KEY。 ref 可以通过=或=运算符用于索引列。
Query-13explain select * from people where zipcode='100000';
邮政编码、名字和姓氏构成索引。这里只使用了name,即只使用了唯一索引的一部分,所以是ref。
全文
链接是使用全文索引完成的。一般我们使用的索引都是B树,这里就不举例了。
引用或空
这种类型与ref 类似。但是MySQL 会对包含NULL 的列进行额外的搜索。这种连接类型的优化通常用于解决子查询。
范围
使用索引来选择行,仅检索给定范围的行。键列显示使用了哪个索引。 key_len 包含所用索引的最长键元素。在此类型中,ref 列为NULL。当使用=、=、=、IS NULL、=、BETWEEN 或IN 运算符将键列与常量进行比较时,可以使用范围。
索引范围扫描,索引的扫描从某一点开始,返回符合取值范围的行。常见于between、IN等查询中。
Query-14explain select * from people where id=1 or id=2;
Query-15解释select * from people where id1;
Query-16解释select * from people where id in (1,2);
指数
这种连接类型与ALL 相同,只是只扫描索引树。这通常比ALL 更快,因为索引文件通常小于数据文件。这种类型的通常目的是告诉我们查询是否使用索引进行排序操作。
按索引扫描表仍然是全表扫描,但优点是索引是有序的。 index 和ALL 的区别在于索引类型只遍历索引树。
Query-17解释select * from people order by id;
全部
最慢的方式是全表扫描。
总结
的类型栏解释为从最差到最好:
ALL:全表扫描。
索引:索引扫描。
range:索引范围扫描。
ref:非唯一索引扫描。
eq_ref:唯一索引扫描。
const,system:将查询转换为常量。
null:MySQL在优化时分解了语句,甚至在执行时不需要访问表或索引。
可能的键
possible_keys 列指示MySQL 可以使用哪个索引来查找该表中的行。如果查询涉及的字段有索引,则会列出该索引,但查询可能不会使用该索引。
钥匙
键列显示MySQL实际决定使用的键(索引)。如果没有选择索引,则键为NULL。要强制MySQL 使用或忽略possible_keys 列上的索引,请在查询中使用FORCE INDEX、USE INDEX 或IGNORE INDEX。
密钥长度
key_len 列显示MySQL 决定使用的密钥长度。如果键为NULL,则长度为NULL。使用的索引的长度。长度越短越好,且不会损失准确性。
参考
ref 列显示哪个列或常量与键一起使用来从表中选择行。
表示上表的连接匹配条件,即使用哪些列或常量来查找索引列上的值。
行
rows 列显示MySQL 认为在执行查询时必须检查的行数。请注意,这是一个估计值。
额外的
Extra 是EXPLAIN 输出中另一个非常重要的列。该栏显示查询过程中MySQL的一些详细信息。它包含很多信息。我们仅选取几个要点进行介绍。
使用文件排序
MySQL 有两种方式生成有序结果,通过排序操作或使用索引。当Extra中出现Using filesort时,说明MySQL使用的是后者,但要注意,虽然叫filesort,但并不代表使用文件来排序。只要有可能,排序都会在内存中完成。大多数情况下,索引排序速度更快,所以一般此时也应该考虑优化查询。
使用临时
这意味着使用了临时表。一般来说,看到这个就意味着查询需要优化。即使无法避免使用临时表,也要尽量避免使用硬盘临时表。
不存在
MYSQL 对LEFT JOIN 进行了优化,一旦找到符合LEFT JOIN 条件的行,就不再搜索它。
使用索引
表明查询覆盖了索引,这是一件好事。 MySQL 直接从索引中过滤不需要的记录并返回匹配结果。这是由MySQL服务层完成的,但不需要回表查询记录。
使用索引条件
这是MySQL 5.6中引入的新功能,称为“索引条件推送”。简单来说,MySQL原本无法对索引进行like等操作,但现在可以了。这样可以减少不必要的IO操作,但是只能用在二级索引上。
使用地点
WHERE 子句用于限制哪些行将与下一个表匹配或返回给用户。
注意:使用Extra列中出现的where意味着MySQL服务器将存储引擎返回到服务层,然后应用WHERE条件过滤。
用户评论
确实啊!学习了这个MySQL Explain就感觉看明白了数据库查询的过程,也能更有效地优化SQL语句效率,真实用!
有20位网友表示赞同!
这篇文章解释得太清楚啦!以前总觉得这个Explain用法很神秘,现在终于理解了。以后遇到性能问题可以先用这个查看下慢查询的执行流程。
有16位网友表示赞同!
我感觉写代码好比在修汽车发动机一样,需要了解它的内部机制才能更有效地操控它。这篇讲解能让我更深入地了解MySQL的运作过程,对优化SQL语句很有帮助!
有19位网友表示赞同!
看明白了Explain结果里的各个参数,像“rows_examined”、“select_type”这些,以前都不知道是什么意思了。文章还总结了一些常见情况下的解释,太棒了!
有5位网友表示赞同!
我是新手刚接触mysql数据库管理,这篇介绍正好让我入门,从这篇文章里我学到如何使用Explain查看查询过程和结果的含义。真的很实用啊!
有18位网友表示赞同!
说实话,之前一直觉得这个Explain用起来麻烦挺费时间,结果没想到文章详细地讲解了它的好处,看来还是得慢慢学习掌握,提升SQL的效率确实很重要。
有7位网友表示赞同!
我有个问题,就是有时查询结果中会显示"using index",但实际查询效率反而慢了。这篇文章解释起来有点概括,像这种特殊情况该如何判断呢?
有14位网友表示赞同!
我一直用索引优化SQL性能,这篇讲解里提到可以用Explain查看索引的扫描方式,感觉受益匪浅!看来以后得更善于利用Explain来针对性的优化查询计划。
有13位网友表示赞同!
看了这篇文章后,感觉MySQL Explain用法确实很强大,能够直观地了解查询过程,方便排查问题、优化SQL语句。现在开始每个查询性能不够的代码都会用到这招了!
有13位网友表示赞同!
文章讲解比较全面,涵盖了Explain分析各个参数含义和实际应用场景的使用技巧。学习完成之后感觉对自己MySQL数据库调优能力提升不少。
有15位网友表示赞同!
这个Explain用法确实太棒了,能够直观地了解查询执行过程,简直就是SQL优化的神器!以后遇到性能问题再也不用摸索了,只要用Explain就能一目了然
有9位网友表示赞同!
这篇文章让我更深刻的理解了MySQL数据库的使用技巧,特别是Explain方法的实用性。原来可以这样查看和诊断查询流程!
有11位网友表示赞同!
Explain确实很强大,能够快速分析SQL语句执行过程,找到性能瓶颈, 文章中解释都很清楚,学习起来并不困难。
有20位网友表示赞同!
我觉得这篇文章写的太好了!我终于明白为什么我的某些SQL语句运行速度那么慢了! 从中可以看出优化SQL语句的重要性!
有16位网友表示赞同!