首页 > 自考资讯 > 自考资讯

mysql解释用法介绍和结果含义有什么好处?

2024-10-09

大家好,如果您还对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是如何访问表的。的。主要有以下几类。

常量

当确定最多有一行匹配时,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树,这里就不举例了。

引用或空

mysql解释用法介绍和结果含义有什么好处?

这种类型与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解释用法介绍和结果含义有什么好处?

键列显示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位网友表示赞同!

心安i

看明白了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位网友表示赞同!

丢了爱情i

Explain确实很强大,能够快速分析SQL语句执行过程,找到性能瓶颈, 文章中解释都很清楚,学习起来并不困难。

    有20位网友表示赞同!

颓废人士

我觉得这篇文章写的太好了!我终于明白为什么我的某些SQL语句运行速度那么慢了! 从中可以看出优化SQL语句的重要性!

    有16位网友表示赞同!

猜你喜欢