Redis底层中的数据结构
SDS简单动态字符串(Simple Dynamic String),与C字符串不同。SDS结构体字典如下:
buf 保存SDS的字符数据的字符数组
len,已保存的字符串长度(字节数),结尾的’\0’字符不算在len中
alloc, 预分配空间大小
flags, SDS的头类型,控制SDS头大小
与C的区别:
常数复杂度获取字符串长度
自动分配内存,杜绝缓冲区溢出且减少分配内存次数
空间预分配
修改后的字符串长度len<1MB,会分配2*len+1byte的空间
修改后的字符串长度len>=1MB,会分配len+1MB+1byte的空间
惰性空间释放
进行字符串缩短操作后并不会马上释放空闲空间
二进制安全
无视’\0’等特殊字符串的影响,使得SDS可以保存任意二进制数据
IntSet整型集合(Int Set),有序,长度可变。结构体字段如下:
encoding 编码方式(16,32,64)
length 元素个数
contents 字节数组,保存集合数据
当新添加的元素大小超过现集合的编码类型表示的数值范围,IntSet会自动升级至合适 ...
MySQL之日志
错误日志错误日志记录了MySQL启动和停止时,服务器运行过程发生的错误相关信息;该日志默认开启。
查看日志位置,一般位于/var/log下
1show variables like '%log_error%'
二进制日志BINLOG,记录了所有DDL和DML
作用:
灾难时的数据恢复
MySQL的主从复制
MySQL8中二级制日志默认开启
查看日志位置:
1show variables like '%log_bin%'
日志格式:
STATEMENT
基于SQL语句的记录
ROW
基于行的日志记录,记录每行的数据变更
MIXED
混合STATEMENT和ROW
查看格式:
1show variables like '%binlog_format%';
可在MySQL配置文件使用binlog_format=xxx指定日志格式
查看binlog需要使用mysqlbinlog来查看,具体语法:
1mysqlbinlog [-arguments] logfile
清理日志:
restart master ...
MySQL之InnoDB引擎
逻辑存储结构
TableSpace 表空间
ibd文件,一个mysql实例可以对应多个表空间,用于存储记录、索引等数据
Segment 段
分为数据段、索引段、回滚段,InnoDB是索引组织表,数据段就是B+树的叶子节点,索引是B+树的非叶子节点。
Extent
区,表空间的单元结构,每个区大小为1M
Page
页,InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB,为了保证页的连续性,InnoDB存储引擎每次从磁盘申请4-5个区
Row
行
架构内存结构Buffer Pool执行增删改操作时,先操作缓冲池数据;若没有数据,则从磁盘加载并缓存;然后再以一定频率刷新到磁盘从而减少磁盘IO
缓存池以Page为单位,用链表管理Page。
free page 即空闲Page
clean page 被使用但违背修改过的page
dirty page 脏页,数据被修改过,可能与磁盘数据不一致
Change Buffer更改缓冲区,针对非谓唯一二级索引页,在执行DML语句时,如果这些数据Page没有在Buffer Pool中,不会直接操作磁盘,而回将数据变更 ...
MySQL之锁
概述锁是计算机协调多进程/线程访问临界资源的机制。MySQL中,按锁的的粒度可分为三类锁:
全局锁:数据库中所有表
表级锁:每次操作锁整张表
行级锁:每次操作锁相应的行
全局锁加锁后整个实例处于只读状态。
应用场景:全库的逻辑备份
12345678-- 加全局锁flush tables with read lock;-- 备份数据mysqldump -u root -p your_database > xxx.sql-- 解锁unlock tables;
存在的问题:
主库备份:备份期间业务停摆
从库备份:不能执行主库同步过来的binlog,导致主从延迟
故推荐用参数--single-transaction代替全局锁完成一致性数据备份
1mysqldump --single-transaction ...
表级锁表级锁又分为:
表锁
表共享读锁
表独占写锁
元数据锁
意向锁
表锁1234-- 加锁lock tables table_name [read|write];-- 释放锁unlock tables;
表共享读锁, 表独占写锁与Golang的 ...
MySQL之存储过程&函数&触发器
存储过程存储过程是实现经过编译并存储在数据库中的一段SQL语句的集合,即实现了SQL代码的封装与重用
特点:
封装、复用
可以接收参数,也可以返回数据
减少网络交互,效率提升
存储过程的使用创建1234CREATE PROCEDURE procedure_name([参数列表])BEGIN -- sqlEND;
命令行中创建存储过程需要通过delimiter指定SQL语句的结束符
调用1call procedure_name (arguments...)
查看1234-- 查看指定数据库的存储过程select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'database_name';-- 查看创建存储过程的sql语句show create procedure procedure_name;
删除1drop procedure if exists procedure_name;
变量系统变量MySQL提供了一些系统变量,分为全局变量和会话变量
查看123show [session ...
MySQL之视图
简介视图是一种虚拟表,它并不存储实际的数据,而是通过 SELECT 语句定义了一个结果集。视图可以简化复杂的查询,提供数据的安全访问机制,并且可以让用户看到多个表的组合结果。
视图的定义本质上是一个 SELECT 语句。
当查询视图时,实际上是执行了视图定义中的 SELECT 语句。
视图还具有持久性、安全性、可重用性等特点,这使得它不仅仅是简单的 SELECT 语句别名。
持久性:视图定义保存在数据库中,即使数据库重启后仍然存在;视图本身不存储数据,而是指向数据库中实际存储的数据
安全性:视图可以用来限制用户访问敏感数据;用户只能通过视图访问数据,而不能直接访问基础表
可重用性:视图可以被多次使用,就像使用表一样
视图的增删改查创建1CREATE [OR REPLACE] VIEW view_name AS SELECT语句;
查询查询视图的SELECT语句:
1show create view view_name;
查询视图数据用法和查询表数据用法一致
修改
方法一:CREATE OR REPLACE VIEW view_name AS ...
方法二:ALTER VI ...
MySQL之SQL优化
插入数据
批量插入(但也不用一次插入超过1000条记录)
insert into ... values (...) (...) ... (...)
手动提交事务(可以避免频繁的事务开启和关闭)
12345start transaction;insert ...insert ......commit;
主键顺序插入性能高于乱序插入
大批量插入数据使用MySQL提供的load指令
12345678# 客户端连接服务端加上参数 --local-infilemysql --local-infile -u root -p# 设置全局参数local_infile=1set global local_infile = 1;# 执行load指令load data local infile '/path/to/file' into table `table_name` fields terminated by ',' lines terminated by '\n';
主键优化InnoDB的存储方式为索引组织表(IOT),即表数据是根据 ...
MySQL之索引
索引概述索引(Index)是MySQL高效获取数据的数据结构
优点:
提高数据检索的效率,降低数据库的IO成本
通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗
劣势:
索引列要占空间
降低更新表的速度
索引结构MySQL索引由存储引擎实现,不同存储引擎有不同结构:
B+Tree 最常见
Hash
R-Tree
Full-text
数据结构补充:
搜索二叉树:任意节点都满足: 左子树最大值 < 根节点值 < 右子树最大值
红黑树: 平衡的搜索二叉树
B-Tree(多路平衡查找树): 一个节点最多可以存储4个key5个指针;每个指针指向的子树的值均在该指针相邻的key值表示的区间
B+Tree
所有元素会出现在叶子节点
根元素会出现在右节点第一个
MySQL中对经典B+Tree基础上,在叶子节点增加了指向相邻叶子节点的指针
相对二叉树,层级更少,搜索效率高
相对于B-Tree,要保存叶子节点和非叶子节点,导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低
Hash用hash算法将键值换算城信ha ...
MySQL之存储引擎
MySQL体系结构
连接层
处理客户端连接;认证与授权
服务层
SQL接口
解析器
查询优化器
缓存
引擎层
可插拔的存储引擎
存储层
Redo
Undo
Data
Index
Binary
Error等
存储引擎存储引擎是存储数据,建立索引,更新/查询数据等技术的实现方式。
存储引擎基于表,而不是库,所以存储引擎也被称为表类型的。
12-- 展示当前数据库支持的存储引擎show engines;
在建表语句末尾可加上engine=xxx来使用指定的存储引擎
存储引擎特点InnoDB
DML遵循ACID,支持事务
行级锁
支持外键
每个表对应一个xxx.ibd文件,用innodb_file_per_table控制,默认为ON
可以用ibd2sdi工具来从ibd文件提取出sdi表结构数据
逻辑存储结构
TableSpace
Segment
Extent
Page
Row
应用场景:要求事务完整性,并发条件下要求数据的一致性,数据操作包括增删改查
MyISAM
不支持事务,不支持外键
支持表锁,不支持行锁
访问速度快
文件:
sdi 存储表结构 ...
Redis基础
Redis介绍redis是一个键值存储系统,其数据存储在内存中,故常作为后端应用的缓存数据库来提高存储层的数据吞吐量。
特点:
键值型存储
单线程(指命令执行)
低延迟,速度快
通用命令通用命令查询指令:help @generic
常见redis通用命令:
keys 查询键值(支持模糊查询,生产环境不适用)
del 删除键值,返回成功删除的键值对数
exists 判断key是否存在
expire 给一个key设置有效期
ttl 查看一个key的剩余有效期
Stringredis中最简单的存储类型。根据字符串格式可分为3类:
string 普通字符串
int 整型
float 浮点型
int和float可以做增减操作;字符串类型最大空间不能超过512MB
常用命令:
12345678910111213141516171819202122232425set name johnget name # johnmset k1 v1 k2 v2 k3 1 k4 0.5mget name k1 k2 #1) john#2) v1#3) v2incr k3 # 2incrby k3 2 # ...