MySQL的复制

复制 复制是让一台服务器的数据和其他服务器保持同步。MySQL的复制是通过binlog实现的,binlog有三种类型: statement:记录的就是SQL语句,优点是人类可读,并且占用空间较小,但是基于该类型binlog的复制可能会产生不一致,比如执行某个特定函数,在复制后的结果可能和之前不一样。 raw:记录的是具体的每一行的变化细节,可以保证复制的正确性,保证数据一致,但是一行一行的记录占用空间较大。实际使用中采用raw的比较多。 mixed:是statement和raw的结合,一般的语句修改都采用statement格式保存,当碰到一些可能引起复制不一致的函数时,改为采用raw保存。这样既能缩小日志占用空间,也可以保证复制的数据一致性。 复制的过程 主库产生binlog 备库的IO线程,请求主库的binlog,并将binlog保存到自己本地的中继日志relay log中 备库的sql线程读取relay log,通过重放relay log完成复制 后续会进行详细说明,大体的过程如下图:

继续阅读

MySQL的事务

事务的特性 事务就是一组原子性的SQL语句。这一组SQL语句要么全部执行成功,要么全部不执行。只要有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。事务处理系统需要包含以下四个特性(ACID): 原子性(atomicity) 一个事务必须被看作是不可分割的最小工作单元。不可能执行成功其中的一部分操作,要么全部提交成功,要么全部失败回滚,不能存在部分成功部分失败的状态。 一致性(consistency) 数据库总是从一个一致性的状态,转换到另一个一致性的状态。

继续阅读

Golang的slice底层实现

Slice的底层数据结构 Golang的slice切片依托于数组实现,和数组的差别就是slice可以方便的扩容,实际使用中除了在少数情况我们明确知道数组长度时,大多数时候都是用的是slice,因为不用担心容量不够的问题。但是如果不了解它内部的实现机制,就有可能会遭遇一些莫名的现象。 slice底层结构: // 源码位于src/runtime/slice.go type slice struct{ array unsafe.Pointer len int cap int } array是一个unsafe.

继续阅读

MySQL的索引

数据库索引 索引是一种数据结构,可以为不同的场景提供更好的性能。对于数据库来说,索引的功能就是提高数据查询的效率,但同时不可避免的也会增加数据写入的消耗,二者之间需要一个平衡,只要当查询带来的好处远远大于写入时的额外工作时,索引才是有意义的。 数据库表建立索引的主要优势: 大大减少服务器需要扫描的数据量 索引可以帮助服务器避免排序和临时表 索引可以将随机IO变为顺序IO 常见的索引数据结构 哈希表:

继续阅读

MySQL的架构和语句执行过程

MySQL的整体架构图 如上图所示,整体上看MySQL分成上下两层,上面那层是Server层,下面是存储引擎层。 Server层包含了连接器、查询缓存、解析器、优化器、执行器(有的资料中说有)等组件,,主要负责的是跨存储引擎的功能,如存储过程、触发器、视图等,内置函数也是在Server层提供的。 存储引擎层则是MyISAM、InnoDB、Memory等各种存储引擎,以插件式集成,负责数据的读写。 连接器 用于和客户端建立连接,并维持和管理连接。并在连接建立时查询用户的权限表获取到该用户的所有权限,建立连接的过程大概如下: 首先进行TCP握手,建立TCP连接 然后进行身份认证,这一步会查询MySQL的权限表,通过后会从权限表中拿到用户的所有权限,并保存在这个连接中,后续的所有权限判断,都是基于这次查询得到的权限数据,不会再去查权限表了 通过用户的身份认证之后,连接就建立起来了 通过命令show processlist可以观察当前数据库的所有连接:

继续阅读

编写Makefile

make工具介绍 项目构建往往要经过一系列的过程,尤其是C项目,可能需要先编译这个,再编译那个,再添加个链接,完了再打个Docker镜像,会有很多的文件需要创建和更改。这些动作,我们既可以通过手工的方式,一步步完成,不免显得繁琐。或者也可以写个shell脚本自动完成。但是make是专门做这件事的。 make的环境准备 对于linux或者mac系统,只要有gcc,一般都会有make,通过命令make -v可以检查你当前的环境有没有make,而在windows上想使用make还是比较复杂的,尽管网上有很多教程,但是我都没有尝试成功,推荐还是尽量在linux或者mac环境下使用make构建你的项目。 make的使用 make的使用非常简单,笔者不是make大神,使用make都是通过一条 make 命令和编写一个Makefile文件即可。 Makefile的编写 Makefile中需要指明要进行哪些操作,这些操作需要有哪些前置操作,或者需要哪些前置文件,最终又生成了什么文件。

继续阅读

大连之旅

2021年10月2日,出发去大连…… 周水子机场外的牌子: 海边的空气很好,但是风也很大,看见一束飘向空中的氢气球,有点美好,也很残酷: 到达傍晚时的星海湾: 海鸥天天会来这蹭吃的: 星海广场附近的一个城堡式酒店,以后有钱了进去住住看: 晚上的星海湾,一个在船上钓鱼的老头: 第二天我们去了威尼斯水城,这里海边的别墅真不错,我看了一下价格一套八百多万 Σ( ° △ °|||)︴ 威尼斯水城的一间教堂,感觉跟我家那边的风格不太一样: 大连到处都是广场,我们也是在一个广场上遇见了婉玲 跟着婉玲的建议去坐了大连的有轨电车,很有复古风: 晚上回星海湾一个名叫《浪》的酒吧里喝了点酒,聊了会天: 大连有的地名很好听,比如“海之韵” 海之韵附近的棒棰岛: 我们的旅程快结束了,最后去了一个公园,大连除了广场很多,公园也很多: 公园的山上可以看到星海湾大桥: 然后和婉玲道别,希望以后还能再见 我们的合影: (昊哥,婉玲,我)