精华内容
下载资源
问答
  • 很多时候所谓的的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。MySQL的逻辑架构图如下所示MySQL逻辑架构整体分为三层。其中最上层为客户端层,并非MySQL所独有,诸如:连接...

    2ff34e647e2e3cdfd8dca593e17d9b0a.png

    很多时候所谓的的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。

    MySQL的逻辑架构图如下所示

    MySQL逻辑架构整体分为三层。其中最上层为客户端层,并非MySQL所独有,诸如:连接处理、授权认证、安全等功能均在这一层处理。

    中间这一层包含大多数MySQL核心服务,包括查询、解析、分析、优化、缓存、内置函数(比如:时间、数学、加密等函数)。所有的跨存储引擎的功能也在这一层实现:存储过程、触发器、视图等。

    最下层为存储引擎,其负责MySQL中的数据存储和提取。和Linux下的文件系统类似,每种存储引擎都有其优势和劣势。中间的服务层通过API与存储引擎通信,这些API接口屏蔽了不同存储引擎间的差异。

    MySQL查询过程

    MySQL整个查询执行过程,总的来说分为6个步骤客户端向MySQL服务器发送一条查询请求

    服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段

    服务器进行SQL解析、预处理

    由优化器生成对应的执行计划

    MySQL根据执行计划,调用存储引擎的API来执行查询

    将结果返回给客户端,同时缓存查询结果

    上述过程如下图所示:

    客户端/服务端通信协议

    MySQL客户端/服务端通信协议是“半双工”的:在任一时刻,要么是服务器向客户端发送数据,要么是客户端向服务器发送数据,这两个动作不能同时发生。一旦一端开始发送消息,另一端要接收完整个消息才能响应它,所以我们无法也无须将一个消息切成小块独立发送,也没有办法进行流量控制。

    客户端用一个单独的数据包将查询请求发送给服务器,所以当查询语句很长的时候,需要设置max_allowed_packet参数。但是需要注意的是,如果查询实在是太大,服务端会拒绝接收更多数据并抛出异常。

    与之相反的是,服务器响应给用户的数据通常会很多,由多个数据包组成。但是当服务器响应客户端请求时,客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,然后让服务器停止发送。因而在实际开发中,尽量保持查询简单且只返回必需的数据,减小通信间数据包的大小和数量是一个非常好的习惯,这也是查询中尽量避免使用SELECT *以及加上LIMIT限制的原因之一。

    查询缓存

    MySQL查询缓存的过程如下图所示:

    缓存命中率可以通过如下公式计算:Qcache_hits/(Qcache_hits + Com_select)来计算。

    在解析一个查询语句前,如果查询缓存是打开的,那么MySQL会检查这个查询语句是否命中查询缓存中的数据。如果当前查询恰好命中查询缓存,在检查一次用户权限后直接返回缓存中的结果。这种情况下,查询不会被解析,也不会生成执行计划,更不会执行。

    MySQL将缓存存放在一个引用表(不要理解成table,可以认为是类似于HashMap的数据结构),通过一个哈希值索引,这个哈希值通过查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息计算得来。所以两个查询在任何字符上的不同(例如:空格、注释),都会导致缓存不会命中。

    如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、mysql库中的系统表,其查询结果都不会被缓存。比如函数NOW()或者CURRENT_DATE()会因为不同的查询时间,返回不同的查询结果,再比如包含CURRENT_USER或者CONNECION_ID()的查询语句会因为不同的用户而返回不同的结果,将这样的查询结果缓存起来没有任何的意义。

    然是缓存,就会失效,那查询缓存何时失效呢?MySQL的查询缓存系统会跟踪查询中涉及的每个表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。正因为如此,在任何的写操作时,MySQL必须将对应表的所有缓存都设置为失效。如果查询缓存非常大或者碎片很多,这个操作就可能带来很大的系统消耗,甚至导致系统僵死一会儿。而且查询缓存对系统的额外消耗也不仅仅在写操作,读操作也不例外:任何的查询语句在开始之前都必须经过检查,即使这条SQL语句永远不会命中缓存

    如果查询结果可以被缓存,那么执行完成后,会将结果存入缓存,也会带来额外的系统消耗

    最后的忠告是不要轻易打开查询缓存,特别是写密集型应用。

    如果你实在是忍不住,可以将query_cache_type设置为DEMAND,这时只有加入SQL_CACHE的查询才会走缓存,其他查询则不会,这样可以非常自由地控制哪些查询需要被缓存。

    常见的查询缓存的配置如下所示query_cache_type:是否打开查询缓存。可以设置为OFF、ON和DEMAND。DEMAND表示只有在查询语句中明确写明SQL_CACHE的语句才会放入查询缓存。

    query_cache_size:查询缓存使用的总内存空间。

    query_cache_min_res_unit:在查询缓存中分配内存块时的最小单元。较小的该值可以减少碎片导致的内存空间浪费,但是会导致更频繁的内存块操作。

    query_cache_limit:MySQL能够查询的最大查询结果。如果查询结果大于这个值,则不会被缓存。因为查询缓存在数据生成的时候就开始尝试缓存数据,所以当结果全部返回后,MySQL才知道查询结果是否超出限制。超出之后,才会将结果从查询缓存中删除。

    语法解析和预处理

    MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树。这个过程解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等等。预处理则会根据MySQL规则进一步检查解析树是否合法。比如检查要查询的数据表和数据列是否存在等等。

    查询优化

    经过前面的步骤生成的语法树被认为是合法的了,并且由优化器将其转化成查询计划。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。优化器的作用就是找到这其中最好的执行计划。

    MySQL使用基于成本的优化器,它尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。在MySQL可以通过查询当前会话的last_query_cost的值来得到其计算当前查询的成本。

    查询执行引擎

    在完成解析和优化阶段以后,MySQL会生成对应的执行计划,查询执行引擎根据执行计划给出的指令逐步执行得出结果。整个执行过程的大部分操作均是通过调用存储引擎实现的接口来完成,这些接口被称为handler API。查询过程中的每一张表由一个handler实例表示。实际上,MySQL在查询优化阶段就为每一张表创建了一个handler实例,优化器可以根据这些实例的接口来获取表的相关信息,包括表的所有列名、索引统计信息等。存储引擎接口提供了非常丰富的功能,但其底层仅有几十个接口,这些接口像搭积木一样完成了一次查询的大部分操作。

    返回结果给客户端

    查询执行的最后一个阶段就是将结果返回给客户端。即使查询不到数据,MySQL仍然会返回这个查询的相关信息,比如该查询影响到的行数以及执行时间等等。

    如果查询缓存被打开且这个查询可以被缓存,MySQL也会将结果存放到缓存中。

    结果集返回客户端是一个增量且逐步返回的过程。有可能MySQL在生成第一条结果时,就开始向客户端逐步返回结果集了。这样服务端就无须存储太多结果而消耗过多内存,也可以让客户端第一时间获得返回结果。需要注意的是,结果集中的每一行都会以一个满足①中所描述的通信协议的数据包发送,再通过TCP协议进行传输,在传输过程中,可能对MySQL的数据包进行缓存然后批量发送。

    展开全文
  • 因此,在对MySQL的查询进行优化之前,应该了解一下MySQL查询的生命周期。 上面的这张图,是大家经常看到的MySQL的架构图,关于MySQL的各个部分显示的很详细。如果从大的方面来看,可以将MySQL分为两层,SQL层和存储...

    当你执行一次MySQL查询时,有没有仔细想过,在查询结果返回之前,经过了哪些步骤呢?这些步骤有可能消耗了超出想象的时间和资源。因此,在对MySQL的查询进行优化之前,应该了解一下MySQL查询的生命周期。

    f67ce0edfcd47d9634f8c94fad773bc6.png

    上面的这张图,是大家经常看到的MySQL的架构图,关于MySQL的各个部分显示的很详细。如果从大的方面来看,可以将MySQL分为两层,SQL层和存储层。SQL层包括控制连接、准备语句等,存储层则主要包括以各种插件形式提供的存储引擎。目前对于MySQL来说,最重要的,也是完全支持事务的引擎是InnoDB。

    当应用程序,或者通过客户端执行一个查询时,首先要做的就是创建一个连接,当查询通过连接到达MySQL时,要对其进行解析。解析过程包括,将查询拆分并标记,以便知道查询的类型,并且会使用一个列表,里面包含查询所需的表和列的信息,这个列表会在下一步使用。接下来,MySQL会检查该用户是否有对列表里的对象执行操作的权限。通过权限检查后,查询将进入优化器,优化器会涉及重写查询、决定表的访问顺序,以及使用哪些索引等工作。实际的执行步骤包括从存储引擎层请求数据。每个存储引擎处理的方式可能不同。InnoDB包括一个缓冲池,用于缓存数据和索引、重做和撤消日志、其他缓冲区以及表空间文件。如果查询返回结果,结果将通过SQL层从存储引擎发送回应用程序。关于InnoDB的架构,请参考下图,详细的过程今后找机会介绍:

    876f74abb699e48d100ec9445b8b640c.png

    简单的总结一下,MySQL查询的生命周期包括:创建连接、解析SQL、检查权限、优化查询、执行查询(与存储引擎进行交互)、返回结果给应用程序或客户端。

    096fcd6a1bf52dd3d294e8e05cb57b94.png

    以上内容是对MySQL查询生命周期的一个简单介绍,希望能够对使用MySQL的你有所帮助。

    欢迎关注个人公众号“MySQL解决方案工程师”

    展开全文
  • mysql教程栏目介绍关系数据库的sql的生命周期MYSQL Query Processingsql的执行过程和mysql体系架构基本一致执行过程:连接器:建立与 MySQL 的连接,用于查询SQL语句,判断权限 。查询缓存:如果语句不在查询缓存...

    mysql教程栏目介绍关系数据库的sql的生命周期。

    2020111317143973777.jpg

    MYSQL Query Processingsql的执行过程和mysql体系架构基本一致

    执行过程:

    cc9569e75344d2236d21a1278f4831b4-0.jpg

    连接器:

    建立与 MySQL 的连接,用于查询SQL语句,判断权限 。

    查询缓存:如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中

    如果查询命中缓存,MySQL不需要执行后面的复杂操作,就可以直接返回结果,提升效率

    分析器:

    对 SQL 语句进行硬解析,分析器先会做词法分析。分析SQL 语句的组成成分。判断输入的 SQL 语句是否满足语法规则。

    优化器:

    优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。 不同的执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。

    执行器:有索引:第一次调用的是取满足条件的第一行这个接口,之后循环取满足条件的下一行这个接口,最终把查询结果返回客户端

    无索引:调用 InnoDB 引擎接口取这个表的第一行,判断sql查询条件,如果不是则跳过,如果是则将这行存在结果集中; 调用引擎接口取下一行,重复相同的判断逻辑,直到取到这个表的最后一行。 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端

    理解执行计划EXPLAIN命令输出MySQL将如何执行你的SQL语句,但不会返回数据

    如何使用[root@localhost][(none)]> explain select * from 表名 where project_id = 36;

    +----+-------------+--------------------------+------------+------+---------------+------------+---------+-------+--------+----------+-------+

    | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

    +----+-------------+--------------------------+------------+------+---------------+------------+---------+-------+--------+----------+-------+

    | 1 | SIMPLE | 表名 | NULL | ref | project_id | project_id | 4 | const | 797964 | 100.00 | NULL |

    +----+-------------+--------------------------+------------+------+---------------+------------+---------+-------+--------+----------+-------+复制代码

    idid相同执行顺序由上至下

    id不同,id值越大优先级越高,越先被执行

    select_typeSIMPLE:简单的 select 查询,查询中不包含子查询或者 union

    PRIMARY:查询中包含子部分,最外层查询则被标记为 primary

    DERIVED:是子查询from的一部分

    DEPENDENT SUBQUERY:子查询中的第一个SELECT,子查询依赖于外层查询的结果

    SUBQUERY 表示在 select 或 where 列表中包含了子查询,

    MATERIALIZED:表示 where 后面 in 条件的子查询

    UNION:表示 union 中的第二个或后面的 select 语句

    UNION RESULT:union 的结果

    table表对象

    typesystem > const > eq_ref > ref > range > index > ALL(查询效率)system:表中只有一条数据,这个类型是特殊的const类型

    const:针对于主键或唯一索引的等值查询扫描,最多只返回一个行数据。速度非常快,因为只读取一次即可。

    eq_ref:此类型通常出现在多表的join查询,表示对于前表的每一个结果,都只能匹配到后表的一行结果,并且查询的比较操作通常是=,查询效率较高

    ref:此类型通常出现在多表的join查询,针对于非唯一或非主键索引,或者是使用了最左前缀规则索引的查询

    range:范围扫描 这个类型通常出现在 <>, >, >=, , BETWEEN, IN() 操作中

    index:索引树扫描

    ALL:全表扫描(full table scan)

    possible_keys可能使用的索引,注意不一定会使用

    查询涉及到的字段上若存在索引,则该索引将被列出来

    当该列为NULL时就要考虑当前的SQL是否需要优化了

    key显示MySQL在查询中实际使用的索引,若没有使用索引,显示NULL。

    查询中若使用了覆盖索引(覆盖索引:索引的数据覆盖了需要查询的所有数据),则该索引仅出现在key列表中

    key_length索引长度

    ref表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

    rows返回估算的结果集数目,并不是准确的值

    filtered示返回结果的行数占需读取行数的百分比, filtered 的值越大越好

    extraUsing where:表示优化器需要通过索引回表,之后到server层进行过滤查询数据

    Using index:表示直接访问索引就足够获取到所需要的数据,不需要回表

    Using index condition:在5.6版本后加入的新特性(Index Condition Pushdown)

    Using index for group-by:使用了索引来进行GROUP BY或者DISTINCT的查询

    Using filesort:当 Extra 中有 Using filesort 时, 表示 MySQL 需额外的排序操作, 不不能通过索引顺序达到排序效果. 一般有 Using filesort, 都建议优化去掉, 因为这样的查询 CPU 资源消耗大

    Using temporary 临时表被使用,时常出现在GROUP BY和ORDER BY子句情况下。(sort buffer或者磁盘被使用)

    光看 filesort 字面意思,可能以为是要利用磁盘文件进行排序,实则不全然。 当MySQL不能使用索引进行排序时,就会利用自己的排序算法(快速排序算法)在内存(sort buffer)中对数据进行排序,如果内存装载不下,它会将磁盘上的数据进行分块,再对各个 数据块进行排序,然后将各个块合并成有序的结果集(实际上就是外排序)。

    当对连接操作进行排序时,如果ORDER BY仅仅引用第一个表的列,MySQL对该表进行filesort操作,然后进行连接处理,此时,EXPLAIN输出“Using filesort”;否则,MySQL必 须将查询的结果集生成一个临时表,在连接完成之后行行filesort操作,此时,EXPLAIN输出“Using temporary;Using filesort”。

    提高查询效率

    正确使用索引

    为解释方便,来一个demo:DROP TABLE IF EXISTS user;

    CREATE TABLE user(

    id int AUTO_INCREMENT PRIMARY KEY,

    user_name varchar(30) NOT NULL,

    gender bit(1) NOT NULL DEFAULT b’1’,

    city varchar(50) NOT NULL,

    age int NOT NULL

    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    ALTER TABLE user ADD INDEX idx_user(user_name , city , age);

    复制代码

    什么样的索引可以被使用?**全匹配:**SELECT * FROM user WHERE user_name='JueJin'AND age='5' AND city='上海';(与where后查询条件的顺序无关)

    匹配最左前缀:(user_name )、(user_name, city)、(user_name , city , age)(满足最左前缀查询条件的顺序与索引列的顺序无关,如:(city, user_name)、(age, city, user_name))

    **匹配列前缀:**SELECT * FROM user WHERE user_name LIKE 'W%'

    **匹配范围值:**SELECT * FROM user WHERE user_name BETWEEN 'W%' AND 'Z%'

    什么样的索引无法被使用?**where查询条件中不包含索引列中的最左索引列,则无法使用到索引: **

    SELECT * FROM user WHERE city='上海';

    SELECT * FROM user WHERE age='26';

    SELECT * FROM user WHERE age='26' AND city=‘上海';**即使where的查询条件是最左索引列,也无法使用索引查询用户名以N结尾的用户: **

    SELECT * FROM user WHERE user_name LIKE '%N';**如果where查询条件中有某个列的范围查询,其右边的所有列都无法使用索引优化查询: **

    SELECT * FROM user WHERE user_name='JueJin' AND city LIKE '上%' AND age=31;**索引列不能是表达式的一部分,也不能作为函数的参数,否则无法使用索引查询: **

    SELECT * FROM user WHERE user_name=concat(user_name,'PLUS');

    选择合适的索引列顺序在组合索引的创建中索引列的顺序非常重要,正确的索引顺序依赖于使用该索引的查询的查询方式

    对于组合索引的索引顺序可以将选择性最高的列放到索引最前列,该法则与前缀索引的选择性方法一致

    并不是说所有的组合索引的顺序都使用该法则就能确定,还需要根据具体的查询场景来确定具体的索引顺序

    覆盖索引条件如果一个索引中包含所有要查询的字段的值,那么就称之为覆盖索引

    SELECT user_name, city, age FROM user WHERE user_name='Tony' AND age='28' AND city='上海';因为要查询的字段(user_name, city, age)都包含在组合索引的索引列中,所以就使用了覆盖索引查询,查看是否使用了覆盖索引可以通过执行计划中的Extra中的值为Using index则证明使用了覆盖索引,覆盖索引可以极大的提高访问性能。

    使用索引进行排序

    在排序操作中如果能使用到索引来排序,那么可以极大地提高排序的速度,要使用索引来排序需要满足以下两点即可:ORDER BY子句后的列顺序要与组合索引的列顺序一致,且所有排序列的排序方向(正序/倒序)需一致

    所查询的字段值需要包含在索引列中,及满足覆盖索引

    排序可用demo:SELECT user_name, city, age FROM user_test ORDER BY user_name;

    SELECT user_name, city, age FROM user_test ORDER BY user_name,city;

    SELECT user_name, city, age FROM user_test ORDER BY user_name DESC,city DESC;

    SELECT user_name, city, age FROM user_test WHERE user_name='Tony' ORDER BY city;

    排序不可用demo:SELECT user_name, city, age FROM user_test ORDER BY user_name gender;

    SELECT user_name, city, age, gender FROM user_test ORDER BY user_name;

    SELECT user_name, city, age FROM user_test ORDER BY user_name ASC,city DESC;

    SELECT user_name, city, age FROM user_test WHERE user_name LIKE 'W%' ORDER BY city;

    数据获取建议

    不要返回应用户程序所不需要的数据限制返回数

    LIMIT:MySQL并不能按照需求返回数据量,也就是MySQL总是会查询出全部数据,使用LIMIT子句其实是为了减小网络数据传输的压力,并不会减小数据的读取行数。

    去掉不需要的列SELECT * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,甚至会对服务器的性能产生一定的影响

    如果表的结构在以后发生了改变,那么 SELECT * 语句可能会取到不正确的数据

    执行 SELECT * 语句时,首先要查找出表中有哪些列,然后才能开始执行 SELECT * 语句,这在某些情况会产生性能问题

    使用 SELECT * 语句将不会使到覆盖索引,不利于查询的性能优化

    正确使用索引的优点避免全表扫描单表查询时,全表扫描需要查询每一行

    多表查询时,全表扫描至少需要检索所有表中每一行提高速度可以迅速定位结果集的第一行

    排除不相关的结果

    对于MIN()或者MAX()值不必检查每一行提高排序和分组的效率

    在可以使用覆盖索引的情况下避免row loop-up

    索引的代价如果存在过多索引,数据修改将会变得缓慢受影响的索引需要被更新

    对于写密集型环境压力很大索引消耗过多磁盘空间InnoDB存储引擎将索引和数据存储在一起

    需要监控磁盘空间

    索引最佳实践

    对于如下列考虑使用索引WHERE子句中的列

    ORDER BY或GROUP BY子句中的列

    表连接条件列

    考虑针对字符串型列使用前缀索引可以更快速地比较与loop up

    减少磁盘I/O

    SELECT语句效率低下时考虑避免全表扫描

    尝试增加索引WHERE语句

    表连接条件利用ANALYZE TABLE来收集统计信息

    考虑存储引擎层的优化

    调优表连接方法在ON或USING子句的列上增加索引

    利用SELECT STRAIGHT_JOIN来强制表连接顺序

    在ORDER BY和GROUP BY的列上增加索引

    join连接不一定比子查询效率高更多相关免费学习推荐:mysql教程(视频)

    展开全文
  • mysql数据库复制账号:repl复制格式:基于行的复制通过前面的介绍我们知道MySQL的复制有两种方法基于二进制日志文件位置基于GTID上一节的内容为GTID的格式和存储,这节根据官方文档我们说GTID的生命周期1. GTID生命...

    实验环境

    此次实验的环境如下MySQL 5.7.25

    Redhat 6.10

    操作系统账号:mysql

    数据库复制账号:repl

    复制格式:基于行的复制

    通过前面的介绍我们知道MySQL的复制有两种方法基于二进制日志文件位置

    基于GTID

    上一节的内容为GTID的格式和存储,这节根据官方文档我们说GTID的生命周期

    1. GTID生命周期

    这里以一个事务从主库执行到从库应用的过程来讲解

    1.1 主库提交事务被分配GTID

    当主库执行和提交一个事务后,该事务会被分配一个GTID(主库uuid和最小的未被使用过的事务号),之后会被写入到二进制日志文件中,其位置在具体事务之前

    如果一个事务没有被写入二进制文件,例如被过滤掉或者是只读的,则不会被分配GTID

    1.2 主库GTID写入二进制文件

    分配GTID后,该GTID会在提交的时候以Gtid_log_event 事件的形式写入二进制日志文件中,其位置在具体事务之前

    当日志发生切换或者数据库关闭时该GTID会被写入到mysql.gtid_executed表中

    我们可以通过mysqlbinlog命令看出

    1.3 主库写入到GLOBAL.gtid_executed系统变量中

    在提交时,还会将该GTID加入到GLOBAL.gtid_executed系统变量中

    该变量是个GTID集合,代表目前为止所有被执行过的事务,主要用于复制中

    我们也可以同如下命令查看

    show master status;

    1.4 从库接收主库GTID事务

    当二进制日志被传输到备库后,会被储存在relay 日志中,从库会读取该GTID并设置

    gtid_next变量为该GTID

    这样就告诉备库下一个执行的事务必须为该GTID

    需要注意的是该变量是session级别的

    1.5 从库应用主库GTID事务

    在接收到主库GTID事务并设置好gtid_next后,如果没有其他进程在执行的话,从库执行该GTID事务

    如果同时有多个进程执行该事务,则会选择其中一个(如多线程复制)

    我们可以查询gtid_owned系统变量来确认

    select @@GLOBAL.gtid_owned

    由于该事务已经被主库分配了GTID,所以从库上的该事务不会被分配GTID,而是使用gtid_next变量的值

    1.6 从库写入二进制文件日志

    由于从库重新执行了来自主库的事务,所以他也会写日志到从库的二进制日志文件中

    这里分两种情况如果从库启用了二进制日志功能,则和1.2步骤一致

    如果从库未启用二进制日志功能,则会将gtid和对应的事务语句写入到mysql.gtid_executed表中

    需要注意的是如果未开启二进制日志功能MySQL 5.7及之前只有DML操作是原子级别的,DDL并不是,意味着如果MySQL发生异常,数据可能会变得不一致

    MySQL 8.0后所有操作都支持

    1.7 从库写入到GLOBAL.gtid_executed系统变量中

    同样的在提交后,从库也会将该GTID写入到从库的gtid_executed系统变量中

    2. 多线程复制

    如果启用了多线程复制(slave_parallel_workers > 0),由于是并行执行的GTID事务,每个线程负责不同的GTID,这时gtid_executed变量的值可能会有GAP,系统会自动更新这些值

    3. 什么动作会被分配GTID

    所有的数据库更改(DML或DDL)都会被分配GTID

    数据库的新增删除修改也会被分配GTID

    非事务型的修改也会被记录下来,如果在写入过程中发生异常,则会记录一个incident事件

    如下操作可能会让一个事务分配多个GTID一个存储过程包含多个事务

    drop table语句一次包含多个表

    CREATE TABLE … SELECT 语句,他会被分配一个create table GTID和一个insert GTID

    7. 参考资料

    本专题内容翻译自官方文档并结合自己的环境16.1.3.2 GTID Life Cycle​dev.mysql.com

    展开全文
  • 生命周期: Servlet的生命周期可以分为四个阶段,装载类及创建实例阶段、初始化阶段、服务阶段和实例销毁阶段。  1.装载类及创建实例 客户端向Web服务器发送一个请求,请求的协议及路径必须遵守如下的格式: ...
  • 有时在线上会遇到“MySQL Server gone away”的错误,但是是以一定概率出现的,今天又遇上了,不得不逼迫自己彻底去解决这个事情。老实说,一般遇到这种看不懂的错误,心里还是挺懵的。一来这种错误一般暴露自己底层...
  • 概述MySQL GTID特性是5.6加入的一个强大的特性,它的目的在于使用GTID的MySQL能够在整个复制环境中能够自动地切换...GTID事务的生命周期 GTID即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID...
  • mysql字符生命周期

    2018-08-07 23:22:00
    mysql的字符集,对数据的导入导出很关键,明白自己集在不同阶段不同场景下的意义即为重要! 01、查看mysql当前字符集 show variables like '%...02、用户请求mysql数据库字符集的调用  03、字符集的设置 ...
  • 有时在线上会遇到“MySQL Server gone away”的错误,但是是以一定概率出现的,今天又遇上了,不得不逼迫自己彻底去解决这个事情。老实说,一般遇到这种看不懂的错误,心里还是挺懵的。一来这种错误一般暴露自己底层...
  • Servlet 和mysql数据库的连接一、Servlet接口1.抽象方法1). Init() 初始化方法2).service() 服务方法3).destroy() 销毁方法4). getServletConfig() 获取servlet配置信息5). getServletInfo() 获取servlet信息2.生命...
  • mysql数据库复制账号:repl复制格式:基于行的复制通过前面的介绍我们知道MySQL的复制有两种方法基于二进制日志文件位置基于GTID上一节的内容为GTID的格式和存储,这节根据官方文档我们说GTID的生命周期1. GTID生命...
  • 一、项目总结三步骤项目生命周期为基准线、分析要有层次感、不要想到什么说什么。这条基准线上,负责的是哪一块,做了什么。举例说明项目中遇到的问题及怎么解决的。二、项目需求分析管理员1 注册2 登录3 上传视频4 ...
  • 最新推出的软件生命周期政策指出,每一个新产品发布之后两年内, MySQL 公司将会提供免费的更新,此后的三年内,公司只会提供必要的安全补丁更新。在五年期结束之后,一个版本的 数据库 将“寿终正寝”, MySQL 公司...
  • 概述这几天就简单介绍一下GTID好了~这篇是概念篇.....这种方式强化了数据库的主备一致性,故障恢复以及容错能力。官网:https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-lifecycle.html一...
  • 首先结合软件生命周期、项目的开展,数据库生命周期大致可分为这么几个阶段:其中“规划”、“开发”、“实施”所要做的主要工作如下:1. 规划:在立项后,对于数据库平台的软硬件选型,以及大致的数据库架构。1.1...
  • 这种方式强化了数据库的主备一致性,故障恢复以及容错能力。 官网:https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-lifecycle.html 一、初识概念 GTID (Global Transaction ID)是全局事务ID,由...
  • 概述这几天就简单介绍一下GTID好了~这篇是概念篇.....这种方式强化了数据库的主备一致性,故障恢复以及容错能力。官网:https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-lifecycle.html一...
  • mysql数据库复制账号:repl复制格式:基于行的复制通过前面的介绍我们知道MySQL的复制有两种方法基于二进制日志文件位置基于GTID上一节的内容为GTID的格式和存储,这节根据官方文档我们说GTID的生命周期1. GTID生命...
  • mysql数据库

    2017-03-04 21:51:00
    生命周期,拥有,自己的 use e;使用,传进来的 and;和 is e;是 byte ;+127——-128;127+1取返=-128; ip 本机ip;127.0.0.1 mysql --version;命令窗口查询mysql版本(管理员运行命令窗口) 二,mysql...
  • [职责分离原则]职责分离原则是指在设计的时候...也就是考虑该数据的创建,发展,销毁等全生命周期的定义,并将这个定义维护起来提供给消费者作为消费原则;2. 谁最经常使用这个信息:如果某个系统最经常使用这个数...
  • 这是学习笔记的第2270篇文章读完需要5分钟速读仅需3分钟整理了如下数据库的产品周期信息:OracleMySQLMariaDBPerconaRedisMongoDBPostgreSQL1.Oracle在MOS 官方文章:Release Schedule of Current Database Releases...
  • MySQL数据库版本

    千次阅读 2019-08-13 23:01:56
    MySQL 目前支持以下版本:MySQL 5.7、MySQL 5.6、...MySQL 官方服务生命周期支持策略如下: Release GA Date Premier Support End Extended Support End Sustaining Support End MySQL Database 5.0 ...
  • MySQL数据库文件

    2017-08-21 19:41:02
    一、参数文件  MySQL实例启动时,数据库会先...静态参数在整个实例生命周期内不得进行更改,动态参数可以通过SET命令基于session/global修改。 二、日志文件 1、错误日志  通过查看该文件定位数据库存在的问题,
  • 简介Mysql 官方定义 : 索引(Index) 是帮助 Mysql 高效获取数据的数据结构。索引的目的在于提交查询效率,可以类比字典。简单理解为 “排好序的快读查找数据结构”。数据本身之外,数据库还维护着一个满足特定查找...
  • mysql教程栏目介绍关系数据库的sql的生命周期MYSQL Query Processingsql的执行过程和mysql体系架构基本一致执行过程:连接器:建立与 MySQL 的连接,用于查询SQL语句,判断权限 。查询缓存:如果语句不在查询缓存...
  • MySQL数据库中的日志

    2019-06-27 01:05:25
    MySQL数据库中的日志MySQL日志:事务日志(mysql的innodb存储引擎层日志)重做日志(事务日志之redo log)1、redo log的作用2、redo log的内容3、redo log生命周期:redo log什么时候产生4、redo log生命周期:redo ...
  • 经常会被问到MySQL各个版本的生命周期,以及如何选择MySQL版本的问题。今天在这里主要向各位...事先制定好的生命周期,对于用户来说是非常有利的事情,用户可以参照数据库产品的生命周期,根据项目情况,选择适合...
  • MySQL数据库项目/便签

    2020-12-14 13:02:45
    功能性产品需求,主要面向基本需求,具有生命周期长,需求稳定,便于预测,产品改型少的特点。 便签 创建便签 修改便签 删除便签 便签组 创建便签组 删除便签组 修改便签组 检索 便签时间搜索 便签内容搜索 1.2 创新...
  • MySQLMySQL架构在这里插入图片描述查询语句生命周期Mysql服务器监听3306端口;验证访问用户创建MySQL线程检查内存(Qcache)解析SQL生成查询计划打开表检查内存(Buffer Pool)到磁盘读取数据写入内存返回数据给客户端...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 568
精华内容 227
关键字:

mysql数据库生命周期

mysql 订阅