也就是说,MySQL解释了它将如何处理该语句,包括如何连接表以及什么顺序连接表等。...1、SIMPLE SIMPLE:表示最简单的 select 查询语句,也就是在查询中不包含子查询或者union交并差集等操作。...5、UNION UNION:如果union后边又出现的select语句,则会被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived。...6、UNION RESULT UNION RESULT:代表从union的临时表中读取数据,而table列的union1,4>表示用第一个和第四个select的结果进行union操作。...这是评估SQL性能的一个比较重要的数据,mysql需要扫描的行数,很直观的显示SQL性能的好坏,一般情况下rows值越小越好。
也就是说,MySQL解释了它将如何处理该语句,包括如何连接表以及什么顺序连接表等。...1、SIMPLE SIMPLE:表示最简单的 select 查询语句,也就是在查询中不包含子查询或者 union交并差集等操作。...5、UNION UNION:如果union后边又出现的select 语句,则会被标记为union;若 union 包含在 from 子句的子查询中,外层 select 将被标记为 derived。...6、UNION RESULT UNION RESULT:代表从union的临时表中读取数据,而table列的union1,4>表示用第一个和第四个select的结果进行union操作。...这是评估SQL 性能的一个比较重要的数据,mysql需要扫描的行数,很直观的显示 SQL 性能的好坏,一般情况下 rows 值越小越好。
预计阅读时间:30分钟 在网上经常看到一些写SQL优化经历的文章,看完文章发现懂的不用看,不懂的看不懂,大家都是都在讲调优经历,但是忽略了如何看懂执行计划,如何调优。...常见的值有:simple、primary、union、 dependent union、union result、 subquery、dependent...:union连接的两个select查询,见② ④ union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null,见...执行的是改写之后的SQL,很可能和原SQL完全不同,对照原SQL分析执行计划会看晕 3、table列 不论我们的查询语句有多复杂,里边儿包含了多少个表,到最后也是需要对每个表进行单表访问的...--------------------------------------------------------------------------------------------+ table列包含以下四种值
select_type 查询数据的操作类型,有如下 simple 简单查询,不包含子查询或 union,如下图所示,就是最简单的查询语句。...[select_type_simple] primary 是 SQL 中包含复杂的子查询,此时最外层查询标记为该值。...[select_type_primary] subquery 是 SQL 在 select 或者 where 里包含的子查询,被标记为该值。...[select_type_d_subquery] union 是 SQL 在出现在 union 关键字之后的第二个 select ,被标记为该值;若 union 包含在 from 的子查询中,外层select...这些其实是我们分析加锁场景最为关心的字段,后续文章会具体讲解如何根据这些字段和其他工具一起判断复杂 SQL 到底加了哪些锁。 ref ref 列表示使用其他表的哪个列或者常数来从表中选择行。
1、Navicat快捷键 快捷键 描述 相关 描述 Ctrl+Q 打开查询窗口 Ctrl+/ 注释sql语句 Ctrl+Shift +/ 解除注释 Ctrl+R 运行查询窗口的...select_type列常见的有: A:simple:表示不需要union操作或者不包含子查询的简单select查询。...有连接查询时,外层的查询为simple,且只有一个 B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。...:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响 E:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询...推荐:如何查找MySQL中查询慢的SQL语句 推荐:MySQL查询优化之explain的深入解析 在分析查询性能时,考虑EXPLAIN关键字同样很管用。
此列包含锁定行中主键列的值,格式为有效的SQL字符串。如果没有主键,LOCK_DATA则是唯一的InnoDB内部行ID号。...查询语句中不包含UNION或者子查询 PRIMARY 对于包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY...(顾名思义为主查询) UNION 对于包含UNION或者UNION ALL的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询以外,其余的小查询的select_type值就是UNION UNION...(被物化,只执行一次) DEPENDENT SUBQUERY 子查询的第一个SELECT(可能会被执行多次,取决外层的查询) DEPENDENT UNION 在包含UNION或者UNION ALL的大查询中...extra Extra列是用来说明一些额外信息的,我们可以通过这些额外信息来更准确的理解MySQL到底将如何执行给定的查询语句。
2 和 SQL 1 一样, 可以对列 f3 加一个单值索引。...再来看看 SQL 4,SQL 4 的过滤条件也是列 f2,f3,不过两列的关系不是 AND,而是 OR,并且也不包含列 f1,那这样完全不符合组合索引的特征。...,比如上面这条 SQL,index_merge 只是简单对索引 idx_f2、idx_f3 做了一个 union ,没有排序,这时候 OR 和 UNION ALL 性能差不了多少。...SQL 5、SQL 6 这两条 SQL 完全可以用到组合索引 idx_multi,因为列 f1 包含在过滤条件里,不过由于其他的条件不是 and 而是 or,所以也需要给 or 后的列加单值索引,这样...SQL 7 和上面两条 SQL 一样,得单独用到列 f1 的单值索引,不同的是 index_merge 是对三个列进行而不是两个列。
下面是使用 explain 的例子: 在 select 语句之前增加 explain 关键字,MySQL会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果 from 中包含子查询...额外还有 filtered 列,是一个半分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表...当有 union 时,UNION RESULT 的 table 列的值为 union1,2>,1和2表示参与 union 的 select 行id。...4. type列 这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行。...7. key_len列 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。
额外还有 filtered 列,是一个半分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表...当有 union 时,UNION RESULT 的 table 列的值为 union1,2>,1和2表示参与 union 的 select 行id。...4. type列 这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行。...7. key_len列 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。...8. ref列 这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),func,NULL,字段名(例:film.id) 9. rows列 这一列是mysql估计要读取并检测的行数
一 .介绍 EXPLAIN 命令用于SQL语句的查询执行计划。这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的。...三.select_type :查询类型 select_type 列提供了 对表的查询类型。最常见的值包括SIMPLE、PRIMARY、DERIVED 和UNION。...其他可能的值还有 UNION RESULT、SUBQUERY 等等. 2.1 simple 简单查询 (没有union和子查询) 对于不包含子查询和其他复杂语法的简单查询,这是一个常见的类型。...通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出。 EXPLAIN select * from person; 六....那么如何解决呢?
id列: 表示执行顺序,值越大则优先级越高;值相同则从上而下执行 select_type列常见的有: simple:表示不需要union操作或者不包含子查询的简单select查询。...有连接查询时,外层的查询为simple,且只有一个 primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。...一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响 union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以...如果是尖括号括起来union M,N>,与类似, 也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集 Type列 :表示访问类型,性能从低到高依次是:ALL...func Rows列: 表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,值越大性能越差 Extra列: 包含不适合在其他列中显示但十分重要的额外信息 Using index
ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。...filtered 显示了通过条件过滤出的行数的百分比估计值。 Extra 该列包含MySQL解决查询的详细信息Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。...SIMPLE:简单SELECT(不使用UNION或子查询) PRIMARY:最外面的SELECT UNION:UNION中的第二个或后面的SELECT语句 DEPENDENT UNION:UNION中的第二个或后面的...ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。 ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。...filtered显示了通过条件过滤出的行数的百分比估计值。Extra该列包含MySQL解决查询的详细信息 Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
、UNION RESUIT) table 访问引用哪个表(引用某个查询,如“derived3”) type 数据访问/读取操作类型(All、...select_type 常见类型及其含义 SIMPLE:不包含子查询或者 UNION 操作的查询 PRIMARY:查询中如果包含任何子查询,那么最外层的查询则被标记为...实际上是可以的,就是因为Mysql查询优化器可以帮助我们自动对SQL的执行顺序等进行优化,以选取代价最低的方式进行查询(注意是代价最低,不是时间最短) SQL优化 超大分页场景解决方案 如表中数据需要进行深度分页...,如何提高效率?...task_result const PRIMARY PRIMARY 8 const 1 100.00 # 对反例的Explain 1 SIMPLE task_result ALL
1.1.2 主键索引 数据库表经常有一列或多列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。 ...最好避免包含共享列的重叠索引。 检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比较的结果就是该列的可选择性,这有助于确定该列是否适合建立索引,如果适合,确定索引的类型。...主要通过增加一个字段,存储hash值,将hash值建立索引,在插入和更新的时候,建立触发器,自动添加计算后的hash到表里。...3、对SQL语句功能的拆分和修改 4、减少“烂”SQL由运维(DBA)和开发交流(确认),共同确定如何改,最终由DBA执行 5、制定开发流程 1.4.2 不适合走索引的场景 1、唯一值少的列上不适合建立索引或者建立索引效率低...SIMPLE:查询中不包含子查询或者UNION b. 查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY c.
rows 为了找到所需要的行而需要读取的行数,估算值 Extra 额外信息,如using index、filesort等 select_type 常见类型及其含义 「SIMPLE」:不包含子查询或者...UNION 操作的查询 「PRIMARY」:查询中如果包含任何子查询,那么最外层的查询则被标记为 PRIMARY 「SUBQUERY」:子查询中第一个 SELECT 「DEPENDENT SUBQUERY...实际上是可以的,就是因为Mysql查询优化器可以帮助我们自动对SQL的执行顺序等进行优化,以选取代价最低的方式进行查询(注意是代价最低,不是时间最短) SQL优化 超大分页场景解决方案 如表中数据需要进行深度分页...,如何提高效率?...task_result const PRIMARY PRIMARY 8 const 1 100.00 # 对反例的Explain 1 SIMPLE task_result ALL
通过 EXPLAIN,你可以获取 MySQL 是如何准备执行你的 SQL 语句的,包括使用的索引、连接类型、扫描的行数等信息。这些信息对于优化查询性能、识别性能瓶颈至关重要。...ref: 显示索引的哪一列或常量被用于查找值。 rows: 估计为了找到所需的行而要检查的行数。这是一个估计值,不一定完全准确。 filtered: 表示返回结果的行占开始查找行的百分比。...Extra: 包含不适合在其他列中显示但对执行计划非常重要的额外信息。常见值有: Using where: 使用 WHERE 过滤。 Using temporary: 使用临时表来存储中间结果。...ref: 显示索引的哪一列或常量被用于查找值,这里是 const 表示是一个常量值。 rows: 估计为了找到所需的行而要检查的行数。...使用覆盖索引 假设我们现在在 name 和 salary 列上创建了一个复合索引,并且我们想要查询这两个列的值。
, 它的常用取值有: SIMPLE, 表示此查询不包含 UNION 查询或子查询 PRIMARY, 表示此查询是最外层的查询 UNION, 表示此查询是 UNION 的第二或随后的查询 DEPENDENT...因此这样的情况下, type 的值是 index, 并且 Extra 的值是 Using index. ALL: 表示全表扫描, 这个类型的查询是性能最差的查询之一....二、SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。...很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果 七、尽量用union all代替union union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作...如何高效的写出一个替代not exists的sql语句?
领取专属 10元无门槛券
手把手带您无忧上云