MySQL索引优化器选择索引的规则是什么?
作者:卡卷网发布时间:2025-01-01 15:33浏览数量:117次评论数量:0次
<>这次是拯救了我,MySQL索引优化,explain讲得非常清楚了!>
<>前言:>
这篇文章主要讲explain如何使用,还有explain各种参数概念,之后会讲优化
一、Explain用法
模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。
语法:Explain+SQL语句;
如:Explainselect*fromuser;会生成如下SQL分析结果,下面详细对每个字段进行详解
二、id
是一组数字,代表多个表之间的查询顺序,或者包含子句查询语句中的顺序,id总共分为三种情况,依次详解
三、select_type
select_type包含以下几种值
<>>
简单的select查询,查询中不包含子查询或者union查询
<>primary>
如果SQL语句中包含任何子查询,那么子查询的最外层会被标记为primary
<>suquery>
在select或者where里包含了子查询,那么子查询就会被标记为suQquery,同三.二同时出现
<>derived>
在from中包含的子查询,会被标记为衍生查询,会把查询结果放到一个临时表中
<>union/unionresult>
如果有两个select查询语句,他们之间用union连起来查询,那么第二个select会被标记为union,union的结果被标记为unionresult。它的id是为null的
四、tale
表示这一行的数据是哪张表的数据
五、type
type是代表MySQL使用了哪种索引类型,不同的索引类型的查询效率也是不一样的,type大致有以下种类
<>>
表中只有一行记录,是const的特例,几乎不会出现这种情况,可以忽略不计
<>const>
将主键索引或者唯一索引放到where条件中查询,MySQL可以将查询条件转变成一个常量,只匹配一行数据,索引一次就找到数据了
<>eq_ref>
在多表查询中,如T1和T2,T1中的一行记录,在T2中也只能找到唯一的一行,说白了就是T1和T2关联查询的条件都是主键索引或者唯一索引,这样才能保证T1每一行记录只对应T2的一行记录
举个不太恰当的例子,EXPLAINSELECT*fromt1,t2wheret1.id=t2.id
<>ref>
不是主键索引,也不是唯一索引,就是普通的索引,可能会返回多个符合条件的行。
<>range>
体现在对某个索引进行区间范围检索,一般出现在where条件中的etween、and、<、>、in等范围查找中。
<>index>
将所有的索引树都遍历一遍,查找到符合条件的行。索引文件数据文件还是要小很多,所以不用索引全表扫描还是要快很多。
<>all>
没用到索引,单纯的将表数据全部都遍历一遍,查找到符合条件的数据
六、possile_keys
此次查询中涉及字段上若存在索引,则会被列出来,表示可能会用到的索引,但并不是实际上一定会用到的索引
七、key
此次查询中实际上用到的索引
八、key_len
表示索引中使用的字节数,通过该属性可以知道在查询中使用的索引长度,注意:这个长度是最大可能长度,并非实际使用长度,在不损失精确性的情况下,长度越短查询效率越高
九、ref
显示关联的字段。如果使用常数等值查询,则显示const,如果是连接查询,则会显示关联的字段。
十、rows
根据表信息计以及索引的使用情况,大致估算说要找到所需记录需要读取的行数,rows越小越好
十一、extra
不适合在列显示出来,但在优化时十分重要的信息
<>usingfileSort(重点优化)>
俗称"文件排序",在数据量大的时候几乎是“九死一生”,在ordery或者在groupy排序的过程中,ordery的字段不是索引字段,或者select查询字段存在不是索引字段,或者select查询字段都是索引字段,但是ordery字段和select索引字段的顺序不一致,都会导致fileSort
<>usingtemporary(重点优化)>
使用了临时表保存中间结果,常见于ordery和groupy中。
<>USINGindex(重点)>
表示相应的select作中使用了覆盖索引(CoveingIndex),避免访问了表的数据行,效率不错!如果同时出现usingwhere,表明索引被用来执行索引键值的查找;如果没有同时出现usingwhere,表面索引用来读取数据而非执行查找动作。
<>Usingwher>
表明使用了where过滤
<>usingjoinuffer>
使用了连接缓存
<>impossilewhere>
where子句的值总是false,不能用来获取任何元组
<>selecttalesoptimizedaway>
在没有GROUPY子句的情况下,基于索引优化MIN/MAX作或者对于MyAM存储引擎优化COUNT(*)作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
<>distinct>
优化distinct,在找到第一匹配的元组后即停止找同样值的工作
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
- 上一篇:360浏览器是不是对百度有?
- 下一篇:为什么说Node.js有望超越Ja?
相关推荐

你 发表评论:
欢迎