mysql概要的解释
解释主要用于sql语句中的选择查询,可以显示sql语句索引的命中情况,从而更好地利用索引,优化查询效率。解释语法如下:解释[扩展]选择.其中extended是可选的,如果使用了extended,那么show warnings可以用来查看解释后对应的优化信息,也就是在mysql中实际执行的查询。列名描述描述了相关的链接id。如果没有子查询或联合查询,则id为1。Mysql会按照id从大到小的顺序执行查询,在id相同的情况下从上到下执行。Select _选择类型。公共类型表输出的行引用的表。有时您会看到derivedN,其中n对应于id列的值。TypeMysql访问方法,连接访问类型。查询过程中可以使用通用类型“可能的关键字”。此列是在优化初期创建的,但后续优化过程中会根据实际情况进行选择,因此此列中列出的索引在后续过程中可能没有用。如果列为NULL,则表示没有相关索引,可以根据实际情况看是否需要添加索引。密钥访问过程中实际使用的索引。它可能不会出现在可能的关键字中(此时,可能会使用覆盖索引,即使查询中没有where)。_ keys揭示哪个索引更有效,key表示优化器决定哪个索引可以最小化查询成本,这是基于系统开销等总因素,可能是“执行时间”的矛盾。如果mysql被迫使用或忽略可能的_ keys中的索引,则需要在查询中使用FORCE INDEX、USE INDEX或IGNORE INDEX。Key_len显示使用索引的字节数。根据表结构计算,而不是实际数据的字节数。例如,ColumnA(char(3)) ColumnB(int(11)),在utf-8字符集下,key_len=3*3 4=13。计算该值时,要考虑字符列对应的字符集,不同的字符集对应不同的字节数。在mysql5.1.5下,latin1、utf8和gbk的字符、字节和汉字的对应关系ref显示了哪些字段或常量用于配合key从表中查询和记录。显示其他表中用作索引查询中的值的字段或常数。行估计需要扫描以返回结果集的行。不是最终结果集的函数,而是将所有行相乘,以估计整个查询中需要检查的行数。当有限度时,就会不准确。(为什么?)Extramysql查询的附加信息。常见信息选择类型:简单:查询不包含子查询或联合查询。Primary:包含子查询或联合查询的查询中最外层的选择查询。子查询:子查询位于select的目标中,而不是位于子查询的第一个select中。示例:从film _ actor 中解释select(从actor中选择actor _ id)。
从属子查询:子查询内层的第一个选择,它取决于外部查询的结果集。示例:解释从actor _ id所在的actor中选择*(从film _ actor中选择actor _ id)(9501 . 163.com)。
解释从演员中选择*演员身份输入(从电影中选择演员身份,演员身份=1)
解释选择*从演员那里演员id=(从电影中选择演员id _演员那里演员id=1)
不可缓存的子查询:表示子查询,但返回的结果不能缓存,必须根据外部查询重新计算。(什么情况下会出现这种情况?)派生:子查询在from子句中,执行查询时,子查询的结果集将放入临时表(派生表)中。示例:将select * from (select * from actor)解释为a .此时,表列显示derivedN,其中n对应于id列的值。
Union:与联合查询中的第二个和后续选择相对应的类型。示例:解释从film _ actor union中选择*从actor 中选择*所有。
如果从子查询中包含联合,则从子查询中的第一个选择将被标记为派生。示例:解释选择*从(选择*从film _ actor union全部选择*从actor) a 。
联合结果:从联合临时表中获取结果集。例如,上面两个查询结果集中的最后一行。Union1,2,其中id列表由1,2标识,表示id列。当id列表的长度超过20时,将省略以下并集1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、17。示例如上所示。从属联合:子查询中的联合,它是联合中第二个选择之后的所有后续选择,也取决于外部查询的结果集。示例:解释从actor _ id所在的actor中选择*(从film _ actor union中选择actor _ id全部从film _ actor中选择actor _ id)(9507 . 163.com)。
不可缓存的联合:表示联合的第二次或以后的选择,但结果不能缓存,必须根据外部查询重新计算。(什么情况下)根据效率由高到低给出了几种常见类型:NULL:mysql在优化过程中分解查询,执行时甚至不需要访问表数据或索引,如id=-1。示例:解释select * from actor,其中actor _ id=-1 。
系统:查询的表只有一行。这是const联接类型的一种特殊情况。(没有任何索引,只有一条数据,MyISAM显示系统,InnoDB显示ALL)const:最多有一条记录匹配。因为只有一行,所以该行中的列值可以被优化器的其余部分视为常数。Const表很快,因为它们只被读取一次。有一个唯一键或主键,where子句为其设置一个比较值。示例:解释从actor中选择*其中actor_id=1(其中actor_id是主键)。
Eq_ref:使用这个索引搜索,您最多可以返回一个合格的记录。当使用主键或唯一索引访问数据时,您可以看到这可能是除了const类型之外最好的连接类型。示例:解释从actor中选择* actor,其中actor.actor_id=actor.actor_id(其中actor _ id是actor和actor的主键,actor中只有一条记录,如果有多条记录,则不是eq _ ref) 。
这是一个索引访问。仅当使用非唯一索引或唯一索引的非唯一前缀时(换句话说,根据该值只能获得一条记录),将该索引与某个值进行比较,该值可能是常数或上一个表中多表查询的结果值。如果使用的键只匹配几行,这种连接类型是好的。示例:解释从film _ actor中选择*演员,其中film _ actor . actor _ id=actor . actor _ id和film _ actor . actor _ id=1(9511 . 163.com)。
Ref_or_null:类似于Ref。不同的是,mysql在检索过程中会额外搜索包含NULL值的记录,这意味着Mysql必须进行第二次搜索,才能在第一次搜索的结果中找到NULL条目。Index_merge:在查询中使用两个或多个索引,然后合并索引结果。在这种情况下,键列包含所有使用的索引,key_len包含这些索引中最长的键元素。从测试中选择column1=1或column2=2(未尝试!55555) Unique _ subquery:用于使用子查询进行优化,子查询由唯一键选择。子查询返回的字段组合是主键或唯一索引。示例:解释从actor _ id所在的actor中选择*(从actor中选择actor _ id)(9512 . 163.com)。
Index _子查询:这种联接类型类似于unique _子查询,子查询中返回的结果字段的组合是索引或索引的组合,但不是主键或唯一索引。示例:解释从film _ actor中选择*其中film _ id在(从film _ actor中选择film _ id)(9513 . 163.com)。
范围:在一定范围内扫描索引。如果在或之间有,则引用列为空。当使用=,=,=,IS NULL,=,key或in运算符将键列与常数进行比较时,可以使用range。索引:按索引顺序扫描数据。按索引扫描会避免排序,但也会扫描整个表数据,随机读取开销会更大。如果额外的列使用索引显示,则意味着使用了覆盖索引(覆盖索引:包含满足查询要求的所有数据列的索引)。对InnoDB表特别有用,此时只能访问索引数据,不需要根据主键信息获取原始数据行,避免了二次查询。但是MyISAM表的优化效果相比InnoDB就没有那么明显了。全部:逐行扫描整个表数据,除非查询中有使用限定符(如distinct或notexists)的限制或额外列。额外信息:distinct:当mysql找到第一个匹配的结果值时,它会停止查询该值,然后继续查询该列中的其他值。不存在:优化器可以通过更改左连接中的原始查询组合来使用的优化方法。当找到匹配的行时,不会继续搜索前一行,这可以部分减少数据访问的次数。例如表t1和t2,其中t2.id不为空,对于从t1中选择*来说,左连接t1上的t2。id=T2。我知道T2在哪里。id为空;因为t2.id不为空,只能在t1中找到,而不能在t2中找到,所以结果相当于找到了差异。最初,左连接意味着两边连接。现在Mysql优化只需要根据t1.id在t2中找到t2.id一次就能跳出来了。未找到Const行:涉及的表为空,其中没有数据。空键全扫描:这是优化器对子查询的一种优化方法,当不能通过索引访问空值时,就会进行这种优化。不可能有:having子句始终为false,并且不能选择任何列。例如,如果1=0,则不可能where:where子句始终为false,并且不能选择任何列。例如,在读取const表后通知Where 1=0是不可能的:MySQL通过读取“const/system表”发现Where子句为false。也就是说,where子句中false条件对应的表应该是const/system表。这不是mysql通过统计信息得出的结论,而是实际访问数据一次后得出的结论。为表指定主键或非空唯一索引的等价条件时,查询最多只能得到一个结果。在解释之前,mysql会根据这个条件优先找到对应的记录,并用记录的实际值替换查询中所有使用表中属性的地方。示例:从a,b中选择*其中a.id=1,b.name=a. name执行如下:首先根据a. id=1查找一条记录(1,' name1 '),然后用' name1 '替换b.name,然后通过a.name='name1 '进行搜索,没有找到命中记录。“不可能在读取const tables后通知”最终被返回。没有匹配的最小/最大行:没有符合以下查询条件的行。示例:解释从actor中选择min (actor_id),其中actor_id为3(只有两条记录)当actor _ id为唯一索引时,将显示“无匹配的min/max行”,否则将显示“使用where”。const表中没有匹配的行:具有联接的查询包含空表或没有符合唯一索引条件的数据。未使用表:查询没有From子句,或者有一个From Dual(dual:虚拟表,以满足选择的习惯.从.)子句。示例:解释为每条记录检查的select version () range(索引映射:n): MySQL发现没有好的索引,但是发现如果进一步得到下一个联接表的列的值,可以通过range使用一些索引。Mysql没有找到合适的可用索引。相反,对于前一个表的每个行连接,它将进行检查以决定使用哪个索引(如果有的话),并使用这个索引从表中获取记录。这个过程不会很快,但它总是比没有任何索引的连接表更快。
选择优化的表:当我们使用一些聚合函数来访问带有索引的字段时,优化器将通过索引直接定位所需的数据行来完成整个查询。使用敏敏、max的query等一些聚合函数直接访问存储结构(b树或b树)最左边的叶节点或最右边的叶节点,可以通过索引来解决。从表中选择count(*)(不带where等子句),MyISAM保存记录总数,可以直接返回结果,而Innodb需要扫描整个表。查询中不能有按操作分组。未找到唯一行:对于SELECT … FROM tbl_name,没有行满足唯一索引或主键。从表中搜索id不存在的值将显示在读取const表后通知不可能的地方。使用filesort: Mysql将以外部排序的方式排列结果,而不是按索引顺序。数据少时从内存排序,否则从磁盘排序。解释将不显示的内容,告诉客户端使用哪种排序。使用索引:意味着Mysql避免了使用覆盖索引扫描整个表,不需要再次在表中搜索数据。注意不要与类型中的索引类型混淆。对分组依据使用索引:与使用索引类似,只需要为所需的数据读取索引。当查询中有group by或distinct子句时,如果分组字段也在索引中,extra将显示该值。使用临时:Mysql将创建一个临时表来保存中间结果。如有必要,在分组和排序时。例如,如果group by是非键列,优化器将使用根据group by条件构造的唯一键创建一个临时表,然后尝试将每个查询结果(忽略group by)插入到临时表中。如果插入因唯一键而失败,现有记录将相应更新。例如,名称上没有索引,按名称从产品组中选择名称、计数(*),Mysql需要创建一个临时表进行排序。通常,还会显示使用文件排序。使用where:表示Mysql将过滤存储引擎提取的结果。例如,价格没有指数,请从价格=1300.00的产品中选择*。许多where条件可以在搜索时进行筛选,因为它们包含索引中的列,所以不是所有带有where子句的查询都会显示“使用where”。使用连接缓冲区:仅在版本5.1.18之后的值。联接的返回列可以从缓冲区中获取,并与当前表联接。示例:解释从T2 t1选择*其中t1.col10和T2.col10s包含n个数据库:指在处理information_schema查询时需要扫描多少个目录。例如,解释select table _ name,row _ format from information _ schema . tables .互联网上说这个查询将显示Scanned所有数据库,但我尝试了一下,额外的一列是空的。Skip _ open _ table,open _ frm _ only,open _ trigger _ only,open _ full _ table:表示从information_schema查询信息时,文件打开的优化。Skip_open_table:表信息已经获取,不需要打开。Open_frm_only:仅打开。frm文件。仅打开触发器:仅打开。trg文件。Open_full_table:无优化。那个。frm,myd和。我的文件都打开了。使用sort _ union (…)、使用union (…)、使用intersect (…):都出现在index_merge读取类型中。使用sort_union:使用两个或多个键来提取数据,但是优化器无法确保每个键都将提取自然排序的结果,因此需要额外的处理来消除冗余数据。例如,客户的状态,(lname,fname)是一个键,但lname不是一个键,因此从customer where (lname=' Jones ')或(state=' ut ')中选择count (*)。因为lname上没有键,(lname,fname)被使用,所以结果可能会乱序,优化器需要一些额外的工作。使用union:用两个或两个以上的键提取数据,将分别得到的结果进行排序,通过合并可以得到正确的结果。例如,customer中的state和(lname,fname)是键,从customer中选择count (state),其中(lname=' Jones '和fname=' John ')或(state=' ut ')。
使用交集:使用两个或两个以上的键提取数据,分别得到的结果进行排序,通过交集可以得到正确的结果。例如,客户中的状态和(lname,fname)是关键,从客户中选择计数(state),其中(lname=' Jones '和fname=' John ')和(state=' ut ')。使用带推送条件的where:仅用于ndb。Mysql Cluster通过条件下推优化改进了非索引字段和常数之间的直接比较。条件被下推到集群的数据节点,并在所有数据节点同时被估计。剔除不合格栏目,避免网络传播。在mysql5.1.5中,latin1、utf8、gbk的字符和字节与汉字的对应关系是:latin1: 1character=1byte,1character=2character。一个字段定义为varchar(200),可以存储100个汉字或200个字符,占用200个字节。特别是当字段内容由字母和汉字组成时,尽量假设字段内容由汉字组成,并相应设置字段长度。utf 8:1字符=3字节,1个汉字=1个字符如果一个字段定义为varchar(200),它可以存储200个汉字或200个字母,占用600字节。Gb:1字符=2字节,1个汉字=1个字符如果一个字段定义为varchar(200),它可以存储200个汉字或200个字母,占用400个字节。word版软件包下载。
版权声明:mysql概要的解释是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。