mysql 数据库执行计划
在介绍数据库服务程序运行逻辑时,在SQL层处理SQL语句时,会根据解析器生成解析树(多种处理方案);
然后在利用优化器生成最终的执行计划,然后在根据最优的执行计划进行执行SQL语句;
作为管理员,可以在某个语句执行前,将语句对应的执行计划提取出来进行分析,便可大体判断语句的执行行为,从而了解执行效果;
可以简单理解:执行计划就是最优的一种执行SQL语句的方案,表示相应SQL语句是如何完成的数据查询与过滤,以及获取;
2数据库执行计划获取
可以利用命令进行获取执行计划信息:explain/desc
explain select * from baimei.t100w where k2='VWlm';
或者
desc select * from baimei.t100w where k2='VWlm';
3数据库索引应用类型 type
利用类型信息,来判断确认索引的扫描方式,常见的索引扫描方式类型:
序号 | 类型 | 解释说明 |
---|---|---|
01 | ALL - ok | 表示全表扫描方式,没用利用索引扫描类型; |
02 | index | 表示全索引扫描方式,需要将索引树全部遍历,才能获取查询的信息(主键index=全表扫描) |
03 | range | 表示范围索引方式,按照索引的区域范围扫描数据,获取查询的数据信息; |
04 | ref | 表示辅助索引等值(常量)查询,精准定义辅助索引的查询条件 |
05 | eq_ref | 表示多表连接查询时,被驱动表的连接条件是主键或者唯一键时,获取的数据信息过程; |
06 | const/system | 表示主键或者唯一键等值(常量)查询,精准定义索引的查询条件 |
常见索引类型:
① 扫描类型-ALL:
情况一:查询的条件没有走索引
情况二:在利用like查询数据时,%在查询内容前面,也会出现全表扫描
情况三:在利用!=/not in排除查找数据信息时,也可能会出现全表扫描
② 扫描类型-index:
情况一:查询数据信息时,指定了查询索引列,但是没有将索引列作为查询条件
------------------------------------------------------------------------
以上的查询数据方式不推荐
③ 扫描类型-range
情况一:利用> < >= <= between ... , 就会出现范围查询
情况二:在利用like查询数据时,%在查询信息后面,也会出现范围查询
④ 扫描类型-ref
情况一:利用辅助索引列,进行等值查询数据
⑤ 扫描类型-eq_ref
情况一: 被驱动表的连接条件是主键或者唯一键时,获取的数据信息过程;
⑥ 扫描类型-system/const
情况一:利用主键索引(聚簇索引)查询数据时,采用等值方式查询数据
扫描类型执行计划展示效果:
1 -扫描类型-ALL:
此类型出现原因1:查找条件没有索引;
此类型出现原因2:查询条件不符合查询规律(like %%-只针对辅助索引,不影响主键索引-range);
此类型出现原因3:查询条件使用的了排除法(!=/not in-只针对辅助索引,不影响主键索引);
2 扫描类型-index:
此类型出现原因:扫描查询列设置了辅助索引信息,但是没有基于索引列设置查询条件
3 扫描类型-range:
此类型出现原因:查找条件是范围信息(> < >= <= between and in or)
特殊说明:在利用in查询数据信息时,查询效果和逻辑语句or的查询效果是一致;
此类型出现原因:查找条件是模糊信息(like)
4扫描类型-ref:
此类型出现原因:查找条件是精确等值信息
5扫描类型-eq_ref:
此类型出现原因:被驱动表的链表条件是主键或唯一键时
当连接查询没有where条件时:
左连接查询时,前面的表是驱动表,后面的表是被驱动表,右连接查询时相反;
内连接查询时,哪张表的数据较少,哪张表就是驱动表
当连接查询有where条件时,带where条件的表是驱动表,否则是被驱动表
说明:在没有设置比较合理索引情况下,默认选择结果集小的作为驱动表,即小表驱动大表;
但是,此时如果给city表中的population加上索引信息,查找数据的执行计划才是最优的,对应获取数据的性能是最好的;
MySQL驱动表和被驱动表说明:https://www.cnblogs.com/baimei666/p/16892774.html
6 扫描类型-const:
此类型出现原因:查询的数据条件是主键或唯一键,并且是精确等值查询;
数据库索引覆盖长度 :
欢迎来撩 : 汇总all