keyaccess

全网最全 | MySQL EXPLAIN 完全解读

北城余情 提交于 2020-12-22 04:23:45
点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达! EXPLAIN作为MySQL的性能分析神器,读懂其结果是很有必要的,然而我在各种搜索引擎上竟然找不到特别完整的解读。都是只有重点,没有细节(例如type的取值不全、Extra缺乏完整的介绍等)。 所以,我肝了将近一个星期,整理了一下。这应该是全网最全面、最细致的EXPLAIN解读文章了,下面是全文。 文章比较长,建议收藏。 TIPS 本文基于MySQL 8.0编写,理论支持MySQL 5.0及更高版本。 EXPLAIN使用 explain可用来分析SQL的执行计划。格式如下: {EXPLAIN | DESCRIBE | DESC} tbl_name [col_name | wild] {EXPLAIN | DESCRIBE | DESC} [explain_type] {explainable_stmt | FOR CONNECTION connection_id} {EXPLAIN | DESCRIBE | DESC} ANALYZE select_statement explain_type: { FORMAT = format_name } format_name: { TRADITIONAL | JSON | TREE } explainable_stmt: { SELECT statement | TABLE

MySQL优化器功能开关optimizer_switch

牧云@^-^@ 提交于 2020-11-16 02:46:49
MySQL 8.0新增特性 use_invisible_indexes:是否使用不可见索引,MySQL 8.0新增可以创建invisible索引,这一开关控制优化器是否使用invisible索引,on表示考虑使用。 MySQL 5.7新增 derived_merge:派生表合并,类似Oracle的视图合并,当派生SQL中存在以下操作是无法展开UNION 、GROUP 、DISTINCT、LIMIT及聚合操作 duplicateweedout:是否使用使用临时表对semi-join产生的结果集去重 condition_fanout_filter:cost模型在jion 代价计算时考虑condition,是否还要还要考虑condition上的filter,如果是on表示考虑 MySQL 5.6 新增 mrr和mrr_cost_based:针对多列索引,也叫组合索引来做基本扫描,然后对匹配的记录按照主键排序,这样按照有序的主键顺序从磁盘上扫描需要的全部记录。根本功能是把对磁盘的随机扫描转化为顺序扫描。 batched_key_access:对于多表join语句,当MySQL使用索引访问第二个join表的时候,使用一个join buffer来收集第一个操作对象生成的相关列值。BKA构建好key后,批量传给引擎层做索引查找。key是通过MRR接口提交给引擎的. 这样,MRR使得查询更有效率。

数据库实践丨MySQL多表join分析

自作多情 提交于 2020-10-25 04:51:31
Join 并行 Join 并行 1. 多表join介绍 2. 多表Join的方式 不使用Join buffer 使用Join buffer 3. Join执行流程(老执行器) 1. 多表 join 介绍 JOIN 子句用于根据两个或多个表之间的相关列来组合它们。 例如: Orders : OrderID CustomerID OrderDate 10308 2 1996-09-18 10309 37 1996-09-19 10310 77 1996-09-20 Customers : CustomerID CustomerName ContactName Country 1 Alfreds Futterkiste Maria Anders Germany 2 Ana Trujillo Emparedados y helados Ana Trujillo Mexico 3 Antonio Moreno Taquería Antonio Moreno Mexico SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID; OrderID CustomerName

【转】Mysql 多表连接查询的执行细节 (一)

独自空忆成欢 提交于 2020-10-10 18:19:07
原文来自 https://blog.csdn.net/qq_27529917/article/details/87904179 先构建本篇博客的案列演示表: create table a ( a1 int primary key , a2 int , index ( a2 ) ) ; --双字段都有索引 create table c ( c1 int primary key , c2 int , index ( c2 ) , c3 int ) ; --双字段都有索引 create table b ( b1 int primary key , b2 int ) ; --有主键索引 create table d ( d1 int , d2 int ) ; --没有索引 insert into a values ( 1 , 1 ) , ( 2 , 2 ) , ( 3 , 3 ) , ( 4 , 4 ) , ( 5 , 5 ) , ( 6 , 6 ) , ( 7 , 7 ) , ( 8 , 8 ) , ( 9 , 9 ) , ( 10 , 10 ) ; insert into b values ( 1 , 1 ) , ( 2 , 2 ) , ( 3 , 3 ) , ( 4 , 4 ) , ( 5 , 5 ) , ( 6 , 6 ) , ( 7 , 7 ) , ( 8 , 8 ) , ( 9

mysql explain 用法详解

梦想的初衷 提交于 2020-08-13 04:08:43
Explain简介 本文主要讲述如何通过 explain 命令获取 select 语句的执行计划,通过 explain 我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。 下面是使用 explain 的例子: 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL( 如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 )。 mysql> explain select * from actor; +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | actor | ALL |

数据库实践丨MySQL多表join分析

血红的双手。 提交于 2020-08-10 06:29:45
摘要: 在数据库查询中,往往会需要查询多个表的数据,比如查询会员信息同时查询关于这个会员的订单信息,如果分语句查询的话,效率会很低,就需要用到join关键字来连表查询了。 Join并行 Join并行1. 多表join介绍2. 多表Join的方式不使用Join buffer使用Join buffer3. Join执行流程(老执行器) 1. 多表join介绍 JOIN子句用于根据两个或多个表之间的相关列来组合它们。 例如: Orders: Customers: SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID; 2. 多表Join的方式 Hash join使用新执行器实现,在这里不做讨论 MySQL支持的都是Nested-Loop Join,以及它的变种。 不使用Join buffer a) Simple Nested-Loop 对r表的每一行,完整扫描s表,根据r[i]-s[i]组成的行去判断是否满足条件,并返回满足条件的结果给客户端。 mysql> show create table t1; +-------+------------------------

Mysql Join语句执行流程

梦想的初衷 提交于 2020-08-09 05:46:34
JOIN主要使用 Index Nested-Loop Join 和 Block Nested-Loop Join 算法实现 Index Nested-Loop Join 如果 join on 相关的字段存在索引就使用 Index Nested-Loop Join 算法来进行关联 如下sql语句的执行过程: select * from t1 join t2 on (t1.a=t2.a); 对驱动表 t1 做了全表扫描,这个过程需要扫描 100 行; 而对于每一行 R,根据 a 字段去表 t2 查找,走的是树搜索过程。由于我们构造的数据 都是一一对应的,因此每次的搜索过程都只扫描一行,也是总共扫描 100 行; 所以,整个执行流程,总扫描行数是 200。 假设不使用 join,那我们就只能用单表查询。我们看看上面这条语句的需求,用单表查询 怎么实现。 执行select * from t1,查出表 t1 的所有数据,这里有 100 行; 循环遍历这 100 行数据: 从每一行 R 取出字段 a 的值 $R.a; 执行select * from t2 where a=$R.a; 把返回的结果和 R 构成结果集的一行。 可以看到,在这个查询过程,也是扫描了 200 行,但是总共执行了 101 条语句,比直接 join 多了 100 次交互。除此之外,客户端还要自己拼接 SQL 语句和结果

纳管集群接入Virtual Node

会有一股神秘感。 提交于 2020-04-18 11:46:47
接入virtual node 在容器服务的应用目录里找到“ack-virtual-node” 在提供的env中填入合适的值,然后安装即可: Key 说明 ALIYUN_CLUSTERID 集群ID(会自动填入) ALIYUN_RESOURCEGROUP_ID 资源组ID(可以留空) ECI_REGION 地域ID(会自动填入) ECI_VSWITCH 虚拟交换机ID(ECI Pod会挂在这个虚拟交换机下面) ECI_SECURITY_GROUP 安全组ID(ECI Pod会挂在这个安全组下面) ECI_ACCESS_KEY Access Key(virtual node用来操作ECI的凭证) ECI_SECRET_KEY Secret Key(virtual node用来操作ECI的凭证) 在纳管集群中,自有资源上的Pod和virtual node创建出来的ECI Pod默认并不互通 来源: oschina 链接: https://my.oschina.net/u/4397122/blog/3273852