MySQL中的BufferPool与RedoLog的作用

介绍 BufferPool 之前,先抛出一个问题,每次更新,新增,删除的动作,都会去写磁盘吗?如果是,那样效率会不会很低,如果不是,怎么保证数据不会丢失? 不会实时写入磁盘 如果每次对数据的操作都要实时同步到硬盘中,那么将要产

MVCC实现原理

MVCC多版本并发控制机制 在上面博客中介绍了可重复的事务隔离级别下,无法读到其他事务已提交的数据,这个功能就是MVCC(Multi-Version Concurrency Control)来实现的, 对一行数据的读和写两个操作

MySQL数据类型的使用

在MySQL中,选择正确的数据类型,对于性能至关重要。一般应该遵循下面两步: (1)确定合适的大类型:数字、字符串、时间、二进制; (2)确定具体的类型:有无符号、取值范围、变长定长等。 在MySQL数据类

MySQL事务和锁详解

数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题,为了解决多事务

索引优化

CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄', `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位', `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间', PRIMARY KEY (`id`), KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE )

MySQL内部结构

大体来说,MySQL可以分为 server 层和存储引擎层两部分,如下图 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数 (如日期、时间、数学和加密函数

Explain详解

在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是 执行这条SQL 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 explain 两个变种 explain extended

索引的本质

索引是什么 索引是帮助MySQL高效获取数据的排好序的数据结构 最重要的点是有序的,我们用索引就是为了快速的查找数据,如果一堆数据是无序的,程序只能挨个遍历每个元素,对比值,才能找到某个元素,最坏的情况要

github_Action使用

需求 最近想实现一个自动部署惊天博客的功能,我有一个静态博客项目,是使用hugo进行编译和部署的,之前自己写了一个脚本将变动的博客自动编译部署到github page 上,也不是很麻烦。但是需要在本机执行一次命令

Linux下的循环

数字性循环 #!/bin/bash for((i=1;i<=10;i++)); do echo $(expr $i \* 3 + 1); done #!/bin/bash for i in $(seq 1 10) do echo $(expr $i \* 3 + 1); done #!/bin/bash for i in {1..10} do echo $(expr $i \* 3 + 1); done #!/bin/bash awk 'BEGIN{for(i=1; i<=10; i++) print i}' 字符性循环 #!/bin/bash for i in `ls`; do echo $i is file name\! ; done #!/bin/bash for i in $* ; do echo $i is input chart\! ; done #!/bin/bash for i in f1 f2 f3 ; do echo $i is appoint ; done

Go逐行读取文件

package main import ( "bufio" "fmt" "io" "os" ) func main() { filename := "./1.txt" f, err := os.Open(filename) if err != nil { fmt.Printf("read %s fail, err: %v\n", filename, err) } defer f.Close() reader := bufio.NewReader(f) for { line, _, err := reader.ReadLine() if err == io.EOF { fmt.Println("done!") break } fmt.Println(line) // TODO } }

zap包使用

package model import ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) func InitLogger(level string) *zap.SugaredLogger { encoder := getEncoder() // 同时输出到文件和控制台 core := zapcore.NewTee( zapcore.NewCore(encoder, stdWriter(), getLogLevel(level)), zapcore.NewCore(encoder, fileWriter(), getLogLevel(level)), ) return zap.New(core, zap.AddCaller()).Sugar() } func getLogLevel(level string) zapcore.LevelEnabler { switch level { case "DEBUG": return zapcore.DebugLevel case "INFO": return zapcore.InfoLevel case "WARN": return zapcore.WarnLevel case "ERROR": return zapcore.ErrorLevel default: return zapcore.InfoLevel } } func getEncoder() zapcore.Encoder { encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder return zapcore.NewConsoleEncoder(encoderConfig) } func stdWriter() zapcore.WriteSyncer { return zapcore.AddSync(os.Stdout) } func fileWriter() zapcore.WriteSyncer { file, _

RabbitMQ中的内存节点与磁盘节点

每个RabbitMQ 节点只有两种类型,要么是内存节点,要么是磁盘节点 内存节点 内存节点将所有的队列、交换器、绑定、用户、权限和vhost的元数据定义都仅存储在内存中. 显而易见,内存节点拥有更出色的性能 磁

RabbitMQ集群中的交换器

交换器不像队列那样有真实的进程, 它只是一张名称与队列进程PID的关系表 当你将消息发布到交换器时,实际上是由你所连接到的信道将消息上的路由键同交换器的绑定列表进行比较,然后路由消息。正是信道(chann

集群中的队列

从直觉上来看,一说到集群,我们就联想到高可用,一个节点宕机了,不会影响整体服务,客户端会从其他节点拿数据。比如 ES, Redis, mongoDB 等的集群都是符合直觉的架构。 但是,事情到了rabbitMQ 这里,却完全不一样了。 在将