网站建设及使用,企业名字查重系统,建筑工程网格化管理的目的和意义,磁贴式网站模板了解 Explain 执行计划吗#xff1f;
答#xff1a;
explain 语句可以帮助我们查看查询语句的具体执行计划。
explain 查出来的各列含义如下#xff1a; id#xff1a;在一个大的查询语句中#xff0c;每个 select 关键字都对应一个唯一的 id select_type#xff1a;…了解 Explain 执行计划吗
答
explain 语句可以帮助我们查看查询语句的具体执行计划。
explain 查出来的各列含义如下 id在一个大的查询语句中每个 select 关键字都对应一个唯一的 id select_typeselect 关键字对应的那个查询的类型 simple简单查询。表示查询不包含子查询和union primary复杂查询中最外层的 select subquery包含在 select 中的子查询不在 from 子句中 derived包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中也称为派生表derived的英文含义 set session optimizer_switchderived_mergeoff; #关闭 mysql5.7 新特性对衍生表的合并优化
explain select (select 1 from employees where id 5) from (select * from account where id 3) der;
set session optimizer_switchderived_mergeon; #还原默认配置union在 union 中的第二个和随后的 select explain select 1 union all select 1; partitions匹配的分区信息 type表示访问类型即 MySQL 决定如何查找表中的行。从最优到最差分别为system const eq_ref ref range index ALL 一般来说得保证查询达到 range 级别最好达到 ref Null表示 MySQL 在优化阶段分解查询语句执行时不需要再访问表或索引。例如 explain select min(id) from account; 在索引列中取最小值单独查询索引即可执行时不需要再访问表 system当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的比如 explain select * from test; 在 test 表中只有一条数据如果 test 表使用 MyISAM 存储引擎则 type 为 system如果 test 表使用 InnoDB 存储引擎则 type 为 ALL constconst 表示代价时常数级别当根据主键索引、唯一索引、二级索引与常数进行等值匹配时对单表访问就是 const只匹配到一行数据很快. explain select * from account where id 1 eq_refprimary key 或 unique key 索引的所有部分被连接使用 最多只会返回一条符合条件的记录。这可能是在 const 之外最好的联接类型了简单的 select 查询不会出现这种 type。 explain select * from t1 left join t2 on t1.idt2.id ref相比于 eq_ref不使用唯一索引使用普通索引或者唯一索引的部分前缀索引值和某个值相比较可能找到多个符合条件的行 name 是普通索引非唯一索引explain select * from account where name abc range范围扫描通常出现在 in()、between、、等操作 index扫描全索引就能拿到结果一般是扫描某个二级索引会直接对二级索引的叶子节点遍历和扫描。这种查询一般为使用了覆盖索引二级索引比较小所以通常比 ALL 快一些 ALL全表扫描扫描聚簇索引的所有叶子节点通常情况下这需要增加索引来进行优化 possible_keys可能用到的索引 查询时可能出现 possible_keys 有列但是 key 显示 Null 的情况这是因为表中数据不多MySQL 认为索引帮助不大选择了全表扫描 如果该列是 Null说明没有相关索引可以通过添加索引来提高查询性能 key实际上使用的索引 如果为 Null 表示没有使用索引可以使用 force index、ignore index 来强制使用索引 key_len实际使用到的索引长度 key_len 计算规则如下 字符串char(n)、varchar(n) 在 5.0.3 之后n 代表字符数而不是字节数如果是 utf-8一个数字或字母占 1 个字节1 个汉字占 3 个字节 char(n)如果存汉字长度为 3n 字节varchar(n) 如果存汉字utf8长度为 3n2 字节加的 2 字节用来存储字符串长度varchar 是变长字符串如果存汉字utf8-mb4长度为 4n2 字节 数值类型 tinyint1 字节smallint2 字节int4 字节bigint8 字节 时间类型 date3 字节timestamp4 字节datetime8 字节 如果字段允许为 Null则还需要 1 字节记录是否为 Null 计算示例 设置索引idx_balance(balance)explain select name from account where balance 111 ; 该 SQL key_len 54 个字节用于存储 balanceint4B1 个字节记录是否为 Null 设置索引idx_name(name)name 字段编码为 uft8-mb4长度为varchar(10)explain select name from account where name abc; 该 SQL key_len 43name 索引长度为 10使用 utf8-mb4 存储汉字的话1 个汉字占 4 个字节长度为 10 所占用字节为 4 * 10 40还需要 2 个字节存储 varchar 的长度name 字段可以为空因此还需要 1 个字节记录是否为 Null因此 name 索引的长度为 40 2 1 43 如果是 utf-8 编码1 个汉字是占 3 个字节的。 ref当使用索引列等值查询时与索引列进行等值匹配的对象信息常见的 ref 值有const常量字段名例如film.id rows预估的需要读取的记录条数并不是结果集中的行数 Extra—些额外的信息常见的重要值如下 Using index使用覆盖索引Using where使用 where 语句来处理结果并且查询的列未被索引覆盖Using index condition查询的列不完全被索引覆盖where 条件中是一个前导列的范围 示例索引namebalance explain select *from account where name a; Using temporarymysql 需要创建一张临时表来处理查询。出现这种情况需要使用索引进行优化 示例name 字段没有索引此时创建一张临时表来 distinctexplain select distinct name from account Using filesort使用外部排序而不是索引排序数据较少时在内存中排序数据较大时在磁盘中排序一般情况下也是需要考虑使用索引进行优化 示例name 字段没有索引explain select name from account order by name Select tables optimized away使用聚合函数来访问存在索引的某个字段 示例explain select min(id) from account;