数据库记录: MYSQL查询不同用户 最新的一条记录 方法1:查询出结果后将时间排序后取第一条(只能取到一条,并且不能查询不同客户的记录) SELECT CUSTOMER_ID,CONTENT,MODIFY_TIME...,排列好的值作为子查询a,然后再根据子查询a按照CUSTOMER_ID分组) SELECT CUSTOMER_ID,CONTENT,MODIFY_TIME FROM (SELECT CUSTOMER_ID...,CONTENT,MODIFY_TIME FROM `service_records` ORDER BY MODIFY_TIME DESC) a GROUP BY a.CUSTOMER_ID 查询结果为...: group by 可以根据group by 的参数列分组,但返回的结果只有一条,仔细观察发现group by是将分组后的第一条记录返回。...group by结合使用 SELECT CUSTOMER_ID,CONTENT,MAX(MODIFY_TIME) FROM `service_records` GROUP BY CUSTOMER_ID 查询结果为
,ID的序号会递增,ID值越大优先级越高,越先被执行 ID如果相同,可以认为是一组,从上往下顺序执行;在所有组中,ID值越大,优先级越高,越先执行 二、select_type 示查询中每个select子句的类型...DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询。...DERIVED:导出表的SELECT(FROM子句的子查询) MATERIALIZED:物化子查询 UNCACHEABLE SUBQUERY:无法缓存结果的子查询,必须为外部查询的每一行重新计算 UNCACHEABLE...例如,派生表可以来自FROM子句中的子查询 :该行指的是id 值为的行的具体化子查询的结果N 四、type 表示MySQL在表中找到所需行的方式,又称“访问类型”。...ALL 对前面表格中的每个行组合进行全表扫描。如果表是第一个未标记的表 const,通常不好,并且在所有其他情况下通常 非常糟糕。
id SQL执行的顺序的标识,SQL从大到小的执行 id相同时,执行顺序由上至下 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 id如果相同,可以认为是一组,从上往下顺序执行;在所有组中...,id值越大,优先级越高,越先执行 select_type 查询中每个select子句的类型 SIMPLE(简单SELECT,不使用UNION或子查询等) PRIMARY(查询中若包含任何复杂的子部分,...UNION RESULT(UNION的结果) SUBQUERY(子查询中的第一个SELECT) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询) DERIVED(...派生表的SELECT, FROM子句的子查询) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) table 显示这一行的数据是关于哪张表的,有时不是真实的表名字...Key 显示MySQL实际决定使用的键(索引)如果没有选择索引,键是NULL。
,id的序号会递增,id值越大优先级越高,越先被执行 id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行 二、select_type 示查询中每个select...) (6) SUBQUERY(子查询中的第一个SELECT) (7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询) (8) DERIVED(派生表的SELECT..., FROM子句的子查询) (9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) 三、table 显示这一行的数据是关于哪张表的,有时不是真实的表名字...index: Full Index Scan,index与ALL区别为index类型只遍历索引树 range:只检索给定范围的行,使用一个索引来选择行 ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值...如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询 六、Key key列显示MySQL实际决定使用的键(索引) 如果没有选择索引,键是NULL。
UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询) UNION RESULT(UNION的结果) SUBQUERY(子查询中的第一个SELECT) DEPENDENT SUBQUERY...(子查询中的第一个SELECT,取决于外面的查询) DERIVED(派生表的SELECT, FROM子句的子查询) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行...index: Full Index Scan,index与ALL区别为index类型只遍历索引树 range:只检索给定范围的行,使用一个索引来选择行 ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值...如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询 六、Key key列显示MySQL实际决定使用的键(索引) 如果没有选择索引,键是NULL。...• EXPLAIN不考虑各种Cache • EXPLAIN不能显示MySQL在执行查询时所作的优化工作 • 部分统计信息是估算的,并非精确值 • EXPALIN只能解释SELECT操作,其他操作要重写为
图片下面本文会通过慢查询分析, 引出mysql底层优化器在索引选择上的策略以及特性, 并给出索引的最佳实践.二....故可以断定mysql底层在选择索引的时候, 是一个动态调整的过程, 会基于数据分布情况进行动态选择(可能是最合适的也可能选择了很差性能的索引)3.3 尝试3 - 避免排序将排序字段去除, 也是可以避免慢查询...此外有些ORM框架或者分库分表中间件封装了底层sql, 不支持直接修改4.2 改造为子查询子查询里面先按索引查询过滤,然后再排序不过有时候这种方式不符合sql规范, 因为有些严格场景要避免子查询.不过我们这里是没有这种严格限制...优化器选择索引原理mysql底层的查询架构如下, 其中在查询优化器阶段进行最终索引的确定.图片选择索引是MySQL优化器的工作。...满查询优化方案4.1 强制索引4.2 改造为子查询4.3 索引定义优化或筛选条件改造4.4 去除排序 4.5 排序字段优化4.6 调大limit值5. mysql优化器选择索引原理6.
这是SELECT的查询序列号 我的理解是SQL执行的顺序的标识,SQL从大到小的执行 id相同时,执行顺序由上至下 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 id如果相同,可以认为是一组...语句中第二个select开始后面所有select) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询...) DERIVED(派生表的SELECT, FROM子句的子查询) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) 三、table 显示这一步所访问数据库中表名称...如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询 六、Key key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中 如果没有选择索引,键是NULL。...EXPLAIN不能显示MySQL在执行查询时所作的优化工作 部分统计信息是估算的,并非精确值 EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。
如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 3.id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行 二、select_type 示查询中每个...的结果) (6) SUBQUERY(子查询中的第一个SELECT) (7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询) (8) DERIVED(派生表的SELECT..., FROM子句的子查询) (9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) 三、table 显示这一行的数据是关于哪张表的,有时不是真实的表名字...如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询 六、Key key列显示MySQL实际决定使用的键(索引) 如果没有选择索引,键是NULL。...• EXPLAIN不考虑各种Cache • EXPLAIN不能显示MySQL在执行查询时所作的优化工作 • 部分统计信息是估算的,并非精确值 • EXPALIN只能解释SELECT操作,其他操作要重写为
无法缓存结果的子查询,必须为外部查询的每一行重新计算 UNCACHEABLE UNION UNION中的第二个或以后的不可缓存的子查询。 ...) Distinct MySQL正在寻找不同的值,因此它在找到第一个匹配行后停止为当前行组合搜索更多行。...Full scan on NULL key当优化程序无法使用索引查找访问方法时,子查询优化将作为回退策略发生。 Impossible HAVING该HAVING子句始终为false,无法选择任何行。...Impossible WHERE 该WHERE子句始终为false,无法选择任何行。...表示MySQL找到了一个索引,可用于检索GROUP BY或 DISTINCT查询的所有列,而无需对实际表进行任何额外的磁盘访问。此外,索引以最有效的方式使用,因此对于每个组,只读取少数索引条目。
: simple(简单表,即不用表连接或子查询) primary(主查询,即外部查询) union(union中的第二个或者后面的查询语句) subquery(子查询中的第一个select) 1.3 table...一般需要保证查询至少达到range级,最好能达到ref。 1.4.1 ALL 最简单暴力的全表扫描,MySQL遍历全表找到匹配行,效率最差。 对来自先前表的行的每个组合进行全表扫描。...1.4.7 ref_or_null 这种连接类型类似于ref,但是MySQL会额外搜索包含NULL值的行。此联接类型优化最常用于解析子查询。...1.4.9 ref 对于先前表中的每个行组合,将从该表中读取具有匹配索引值的所有行。...支持选择all,cpu,block io,context,switch,page faults等明细,来查看MySQL在使用什么资源上耗费了过高的时间,例如,选择查看cpu的耗费时间 show profile
id相同时,执行顺序由上至下; 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行; id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行。...select SUBQUERY 子查询中的第一个SELECT,结果不依赖于外部查询 DEPENDENT SUBQUERY 子查询中的第一个SELECT,依赖于外部查询 DERIVED 派生表的SELECT..., FROM子句的子查询 UNCACHEABLE SUBQUERY 一个子查询的结果不能被缓存,必须重新评估外链接的第一行 table 输出的行所引用的表。...range: 只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是where语句中出现了between,in等范围的查询。...key 显示MySQL实际决定使用的键(索引)。 如果没有选择索引,键是NULL。
1. from form是一次查询语句的开端。 如果是一张表,会直接操作这张表; 如果这个from后面是一个子查询,会先执行子查询中的内容,子查询的结果也就是第一个虚拟表T1。...(注意:原因在于分组后最终的结果集中只包含每个组中的一行。谨记,不然这里会出现很多问题,下面的代码误区会特别说。) 6. avg,sum.......HAVING子句主要和GROUP BY子句配合使用,having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器。 8. select 执行select操作,选择指定的列,插入到虚拟表T6中。...这段sql的一些说明: 可能有些同学会认为子查询没有必要 直接查询pk记录表就可以,但是并不能拿到预期的结果,因为分组后的每个组结果是不进行排序的,而且max拿到的最高分数肯定是对应的该分组下最高分数,...所以子查询非常有必要,它能够对原始的数据首先进行排序,分数最高的那条就是第一条对应的第一条记录。
只检索给定范围的行,使用一个索引来选择行。...11、 ALL对于每个来自于先前的表的行组合,进行完整的表扫描。(性能最差) possible_keys 指出MySQL能使用哪个索引在该表中找到行。...如果键是NULL,则长度为NULL。 注意:key_len是确定了MySQL将实际使用的索引长度。 ref 显示使用哪个列或常数与key一起从表中选择行。...rows 显示MySQL认为它执行查询时必须检查的行数。 Extra 该列包含MySQL解决查询的详细信息 · Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。...使用LIKE关键字的查询 在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为"%",索引不起作用。只有"%"不在第一个位置,索引才会生效。 ? ?
: simple(简单表,不用表连接或子查询) primary(主查询,外部查询) union(union中的第二个或者后面的查询语句) subquery(子查询中的第一个select) 1.3 table...一般需要保证查询至少达到range级,最好能达到ref。 1.4.1 ALL 最简单暴力的全表扫描,MySQL遍历全表找到匹配行,效率最差。 对来自先前表的行的每个组合进行全表扫描。...1.4.7 ref_or_null 这种连接类型类似于ref,但是MySQL会额外搜索包含NULL值的行。此联接类型优化最常用于解析子查询。...1.4.9 ref 对于先前表中的每个行组合,将从该表中读取具有匹配索引值的所有行。...支持选择all,cpu,block io,context,switch,page faults等明细,来查看MySQL在使用什么资源上耗费了过高的时间,例如,选择查看cpu的耗费时间 show profile
优化器选择执行最有效查询的一组操作称为 查询执行计划 (query execution plan), 也称为 EXPLAIN plan....后的结果.SUBQUERY没有任何子查询中的第一个 SELECTDEPENDENT SUBQUERYdependent(true)子查询中第一个 SELECT, 依赖于外部查询DERIVED没有任何派生表...( false)一个子查询, 其结果无法缓存, 必须为外部查询的每一行重新计算UNCACHEABLE UNIONcacheable( false)UNION 中第二个或靠后的 SELECT, 属于不可缓存子查询...此外, 索引以最有效的方式使用, 因此对于每个组, 只读取几个索引条目....以及 2) 要生成这一行, 必须读取一组确定性的行.
每个客户端的连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。...SUBQUERY:子查询中的第一个SELECT,取决于外面的查询 DERIVED:导出表的SELECT(FROM子句的子查询) (3)table:表名 (4)type:联接类型 system:表仅有一行...ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。...(8)ref:ref列显示使用哪个列或常数与key一起从表中选择行。 (9)rows:rows列显示MySQL认为它执行查询时必须检查的行数。...(10)Extra:该列包含MySQL解决查询的详细信息。 Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
:子查询中的第一个SELECT DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询 DERIVED:导出表的SELECT(FROM子句的子查询) table 输出的行所引用的表...如果没有选择索引,键是NULL。 key_len 显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。 ref 显示使用哪个列或常数与key一起从表中选择行。...Extra 该列包含MySQL解决查询的详细信息 Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。...如果没有选择索引,键是NULL。 key_len 显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。 ref 显示使用哪个列或常数与key一起从表中选择行。...Extra 该列包含MySQL解决查询的详细信息 Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
SUBQUERY(subquery):子查询中的第一个SELECT,结果不依赖于外部查询。...DEPENDENT SUBQUERY(dependent subquery):子查询中的第一个SELECT,依赖于外部查询。...UNCACHEABLE SUBQUERY(uncacheable subquery):(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) 3 table 输出结果集的表名称。...( MySQL能使用哪个索引在该表中找到行) 7 key 实际使用的索引(键),必然包含在possible_keys中。如果没有选择索引,索引是NULL。...Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
如果没有选择索引,键是NULL。 key_len 显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。 ref 显示使用哪个列或常数与key一起从表中选择行。...Extra 该列包含MySQL解决查询的详细信息Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。...SELECT语句,取决于外面的查询 UNION RESULT:UNION 的结果 SUBQUERY:子查询中的第一个SELECT DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询...如果没有选择索引,键是NULL。key_len显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。ref显示使用哪个列或常数与key一起从表中选择行。...Extra该列包含MySQL解决查询的详细信息 Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
领取专属 10元无门槛券
手把手带您无忧上云