MySql协议讲解-事务协议篇 MySql事务协议主要是通过set autocommit、commit以及rollback这三个报文(命令)来实现的。 MySql事务协议交互图 ?...MySql的set variable命令 此命令通常是用来设置局部/全局变量用。也是一种com_query包,如下图所示: ?...由于这个Id是存在mysql的session里面的,只要这个session没有被多线程复用,就不用担心last_insert_id被覆盖的问题。
Mysql两个引擎对比 MyIsam 优点: 1.支持B-Tree检索和文本全文检索 2.性能消耗方面相对较低 3.支持全表(table)锁 缺点: 无事务管理...锁,保证事务完整性 3.支持数据缓存(data caches) 4.支持外键(foreign key)关联 缺点: 性能消耗高,消耗硬盘存储大 (详细对比见下表,来自mysql
写在前面 最近,在开发一个分库分表中间件,由于功能需求,需要分析MySQL协议,发现网上对于MySQL协议分析的文章大部分都过时了,原因是分析的MySQL版本太低了。怎么办呢?...于是乎,我便硬着头皮开始啃MySQL源码,经过两个多月的整理,终于总结出这篇MySQL协议。 注:部分来自于互联网,感谢数据库大牛前辈们的默默付出!!...交互过程 MySQL客户端与服务器的交互主要分为两个阶段:握手认证阶段和命令执行阶段。...服务协议版本号:该值由 PROTOCOL_VERSION 宏定义决定(参考MySQL源代码/include/mysql_version.h头文件定义) 服务版本信息:该值为字符串,由 MYSQL_SERVER_VERSION...代码分析 议程 协议头 协议类型 网络协议相关函数 NET缓冲 VIO缓冲 MySQL API 协议头 ● 数据变成在网络里传输的数据,需要额外的在头部添加4 个字节的包头. . packet length
MySQL中有两个重要的日志模块,分别是redo log(重做日志)和binlog(归档日志)。...当我们学习MySQL的时候,这两部分内容是绕不开的,本文我将来详细的介绍一下这两个日志模块,它们在设计上有很多好玩的地方,一些思想也可以在我们工作中使用。...举上边这个例子是因为MySQL也有这个问题,如果每次更新操作都需要写进磁盘,然后磁盘也要先找到对应的那条数据,然后更新,整个过程IO成本、查找成本很高,为了解决这个问题,MySQL在设计的时候就用了类似饭店记账的思路来提高更新效率...整体来看,分为两部分,一部是Server层,主要做的是MySQL功能层面的事情,还有一部分是引擎层,负责存储相关的具体事情。...这个地方为什么要有两份日志,还要从最开始的时候MySQL中没有InnoDB引擎说起,当时MySQL自带的引擎是MyISAM,但是M有ISAM没有crash-safe的能力,binlog日志只能用来归档,
关键语法 GROUP BY HAVING 统计相关:COUNT,SUM,MAX,MIN,AVG 一 GROUP BY 满足“SELECT子句中的列名必须为分组列...
// MySQL的两个主要分支 // 今天说点儿概念性的东西,关于MySQL的两个最流行的分支,MariaDB和Percona Server,这两个分支其实都有自己的优缺点,这里简单介绍一下分支产生的原因...开始之前,我们首先截取一个当前数据库使用流行度的一个图,来简单分析下这两个分支现在的使用情况,图截取自DB-Engine网站: ?...(以下简称MW)主导开发,MariaDB选自她女儿的名字,2008年Sun公司用10亿美金收购了MySQL,但是由于各种原因,Sun公司又将MySQL转手卖给了Oracle,MW感到失去了对MySQL的控制权...在早期,MariaDB还可以作为MySQL的替代品,从MySQL到MariaDB切换应用程序的时候,不需要做任何改动,然后众多原因导致MariaDB这个分支比MySQL官网更新的更快一点,对内核的修改逐渐增多...,意味着MariaDB的高版本数据库已经不能完全兼容MySQL的官方版本了,使用者不得不做出调整,从而适应高版本的MySQL。
MySql协议详解-HandShake握手篇 各位有没有对Cobar、MyCat这些MySqlProxy感到新奇。反正笔者在遇到这些proxy时,感受到其对代码的无侵入兴感到大为惊奇。...于是走上了研究MySql协议的不归路。现在我就在博客里面将其中所得分享出来,以飨大家。 HandShake协议 下图是笔者整理的HandShake协议交互流程 ?...MySql报文图解 MySql协议与众多基于TCP的应用层一样,为了解决"粘包"问题,自定义了自己的帧格式。其主要通过Packet头部的length字段来确定整个报文的大小。...password的摘要方式 AuthPacket的password是对原密码摘要后的byte流,其根据MySql协议版本的不同分为411和322两个大版本。...即4.1.1版本协议和3.2.2版本协议所采用的加密方法。
mysql主要有很多错误类型,如下两种: 1062:插入数据时唯一键冲突 1032:删除数据时找不到行 我们可以在mysql配置文件中添加以下内容: slave_skip_errors=1062,1032...GTID有两种生成方式,使用哪种方式取决于Session变量gtid_next的值: gtid_next=automatic:使用默认值,mysql会将server_uuid:gno分配给此事务 gtid_next...是指定的值:比如通过set gtid_nex='current_gtid'指定 每个MySQL实例都维护了一个GTID集合,用来对应这个实例执行过的所有事务。...user_name, master_password = $password, master_auto_position=1 master_auto_position=1表示主备关系使用的是GTID协议...,假设当前时刻下,节点A'的GTID集合是set_a,实例B的GTID集合是set_b,我们在B上执行start slave指令以后,节点B对binlog的处理逻辑如下: 节点B指定主库A',基于主备协议建立连接
最近花了些时间分析MySQL锁的内容,觉得越看越有意思。 我有个学习的习惯,有时候也不知道好还是不好,那就是喜欢直接上手练习,然后反过来练习理论。...两个死锁的小例子: 死锁案例1 比如自增列的死锁,一般的死锁得是4条DML语句互相牵制,我们可以做整合,简化,使得死锁的场景变得复杂起来。我们简单来模拟一下。...> begin; Query OK, 0 rows affected (0.00 sec) mysql> select *from d where i=1 lock in share mode; +--...-+ | i | +---+ | 1 | +---+ 1 row in set (0.00 sec) ##session2 mysql> begin; Query OK, 0 rows affected...transaction mysql>
版本:mysql5.5.52 存储引擎:InnoDB 隔离级别:READ-COMMITTED 示例一: 事务1:左图 事务2:右图 1、 事务2中属于快照读,基于多版本的并发控制协议——MVCC...快照读是mysql InnoDB存储引擎下,隔离级别为READ COMMITTED和REPEATABLE READ时,select语句默认的读取模式。...resultStatus)已经执行且持有related_people表相关记录的锁,同时等待status表的锁被释放,但是此时sendChange的一系列操作尚未提交数据库,status的相关记录表仍被事务1持有,两个事务同时持有对方的资源同时在等待对方释放相关的锁
协议包格式 MySQL client和MySQL server之间要想传输数据,必须: 1. 将数据切分成若干个大小不超过 ? 字节(16MB)的packet里面 2....序列号从0开始,在MySQL command(MySQL命令)阶段时,每次有新的命令,就会有新的序列号。 2.2. 基本响应包 2.2.1....在MySQL5.7.5中,OK Packet用来标识EOF,EOF Packet废弃不用了。
如图,最近在测试报表统计的时候,需要测试客单价,我需要先统计出商品的总额,然后再统计商品的订单总订单量,再将他们的数据相除 客单价 = 订单总额 / 订单总量 MYSQL计算公式 例如: sql1=select
我首先询问了一下他表里面的数据量,得到的反馈是这个表是个配置表,数据量就30来条,这我就很放心了,这么小的数据量,即使出了问题,那么恢复起来也比较容易,为了以防万一,我现在测试环境上做了个测试: mysql...>create table test14 (id int primary key,count_date date); Query OK, 0 rows affected (0.08 sec) mysql...+------------+ | 1 | 20190928 | +----+------------+ 1 row in set (0.00 sec) 创建了一个test14的表,里面包含两个字段...02 关于distinct和order by 的一个问题 之前讲过关于MySQL5.7版本的一些参数,其中包含了sql_mode,这个参数是控制MySQL服务的SQL运行模式,5.7版本的模式更为严格...今天这两个小案例虽然看起来不起眼,但是在实际应用中,还是需要多注意,否则很容易出现问题,今天就到这里吧。
接下来我们通过两个真实的案例说明直接使用row格式复制出现的问题。...因为客户的binlog_format设置为row,复制进程也只是延迟,show slave status的relay_master_log_file,exec_master_log_pos两个变量一直没有变化...延伸讨论 MySQL中有一个参数,slave_rows_search_algorithms 可以控制row格式下,mysql执行event时候,搜索对应行的方式。...2 从库alter语句导致同步中断 原因简述 MySQL row格式复制下,主从库之间同一个表如果列的类型不匹配,MySQL会尝试转码,如果转码失败(类型不兼容),则复制中断。...DDL的执行,在MySQL 5.7的时候,基本上都做到了在线改表。
MySql协议详解-CRUD与Result篇 Com_query报文 一般对DB的CRUD操作都由com_query报文封装并发送给DB。com_query报文如下图所示: ?...ResultSet格式 严格来说ResultSet是由多个独立的报文以协议的形式组织起来,现直接放出ResultSet的协议格式图: ?
本来看起来很简单的一个问题,结果因为不经意的操作出了两个问题,会牵扯出来两条有趣的SQL问题。...创建一个表test,有3个字段 mysql> create table test(col1 int,col2 varchar(30),col3 varchar(30)); Query OK, 0 rows...affected (0.11 sec) 插入3条数据 mysql> mysql> insert into test values (1,'aa','aaa'); Query OK, 1 row affected...(0.07 sec) mysql> insert into test values (2,'bb','aaab'); Query OK, 1 row affected (0.00 sec) mysql...mysql> select *from test; +------+------+------+ | col1 | col2 | col3 | +------+------+------+ | 0
MySql-Binlog协议详解-流程篇 MySql-Binlog在MySql主从不同方面发挥着不可或缺的作用,同时我们也能通过Binlog实时监控数据的变化。...(1)第一步和上篇blog一样,通过HandShake协议进行Client和DB的握手认证 (2)握手成功以后,Client对DB发送show master status命令,此命令中回带回当前最新binlog...如果想从当前开始接收binglog,则在后面发送binlog dump命令的时候用这两个值就好。...mysql5.6.5以后的版本中binlog_checksum=crc32,而低版本都是binlog_checksum=none。...如果不想校验,可以使用set命令设置set binlog_checksum=none (4)最后终于到了发送Dump命令的阶段 MySql-Binlog-Dump命令 Dump命令包图如下所示: ?
mysql协议直接和mysql通讯,一窥究竟。...于是主人找到Mysql说:亲爱的mysql,我以前和你交流总要通过第三方的驱动在中间传话,总感觉我们之间还有一个隔阂,有些话也不方便说,我现在有些心里话想直接和你交流。。。你说行吗?...用tcp协议就绕不开三次握手连接和四次握手断开,所以呢你和我连接的第一件事就是三次握手连接。 主人尴尬的笑了笑,tcp的三次握手听到听说过很多次,但是从没有真正的理解。。。...image.png 感觉不直观,在网上找到一个更直观的图: image.png 具体解释如下: protocol_version (1) -- 0x0a protocol_version 第一个字节表示协议版本号...mysql笑道:那当然,我还能骗你不成。
MySql包结构: MySql握手协议 MySql Query(select、update和delete)和Row MySql 结果集(ResultSet) MySql 事务协议
#MySql-Binlog协议详解-报文篇 紧接上篇流程篇,本篇主要将binlog的event报文。 ##Event报文分层 event报文主要分三层。...(1)MySql报文都有的length-body防粘包结构。 (2)Event Header (2)Event Body 总体结构如下图所示: ?...EventBody根据类型分主要有: (1)RotateEventData:当MySql的binlog文件从file1滚动到file2的时候会发生此事件。...(2)一个复杂的Bit集合,有更新的Row在更新之前的值在下面Row列表中的位置 (3)一个复杂的Bit集合,有更新的Row在更新之后的值在下面Row列表中的位置 (4)一个Row的列表,配合上面两个
领取专属 10元无门槛券
手把手带您无忧上云