存储引擎

1、功能
数据读写
数据安全和一致性
提高性能
热备份
自动故障恢复
高可用

2、存储引擎介绍
InnoDB
第三方:RocksDB、MyRocks、ToKuDB
压缩比较高,数据的插入性能高,其他和InnoDB差不多

3、InnoDB
事物
行锁
MVCC
外键(不用)
ACSR
热备
复制(多线程,GTID,MTS)

4、存储引擎
查看:
show engines;
select @@default_storage_engine;
show create table xxx;

修改引擎:
alter table xxx engine=innodb;

整理碎片:
alter table xxx engine=innodb;

二、InnoDB物理存储结构
1、最直观的存储方式
ibdata1:数据字典的统计信息、undo表空间等数据
ib_logfile0 - ib_logfile1:redo日志文件,事物日志文件
ibtmp1:临时表空间存储位置,存储临时表
frm:存储表的列信息
ibd:数据行+索引

2、表空间(tablespace)
表空间数据文件:
ibdata1:元数据+undo日志
ibd:数据行+索引

共享表空间(5.5版本默认模式)===> 独立表空间(5.6版本)

三、事物
ACID
一致性:符合预期的,汇款前后总和不变

事物的生命周期:
begin;
insert update delete
commit; rollback;

set global autocommit=0;

名词解析
redo log:重做日志
ib_logfile0 - ib_logfile1 默认50M,轮询使用

redo log buffer:redo内存区域

ibd:数据+索引文件

buffer pool:ibd文件的内存缓冲

LSN:日志序列号
存在于ibd-buffer pool 和 redo-redo buffer
数据库启动时,要比较ibd和redo log 的LSN,相同才能启动

WAL(write ahead log):
日志优先于数据写入磁盘,redo log > ibd

脏页:
内存脏页,改了内存,写入磁盘之前,叫做脏页

CKPT:
将脏页写到磁盘的动作

TXID:
事物id

(1)事物日志:redo日志
作用:主要保证D,辅助A、C
记录了内存数据的变化
提供快速持久化功能
CSR实现前滚操作

情况一:事物已经提交
更改数据时,将数据从ibd读入buffer pool,更改内存,同时更改redo log buffer,
commit的时候,将redo log buffer写入ib_logfile文件
断电,重启mysql,会先将ibd和ib_logfile中LSN不一致的,读到内存,然后更新buffer poll,立即将脏页写入磁盘,恢复到断电之前的状态,完成重启。

(2)回滚日志:undo日志
作用:
记录数据修改之前的状态
CSR中实现未提交事物的回滚操作
实现一致性快照,保证MVCC,读写操作不会互相阻塞

情况二:事物未提交
断电重启时,如果发现redo日志里有未提交的事物标签,就拿着这个TXID去undo日志找到对应的记录,在内存中回滚,所有未提交的操作均会丢失,再写回磁盘,保证数据一致性

四、锁

实现了事物隔离的功能
InnoDB实现了行级锁
row-level lock
gap
next-lock

隔离级别:
脏读、不可重复读、幻读
RU
RC
RR:解决了不可重复读,但是会出现幻读,通过gap和next-lock解决幻读
SR

select @@transaction_isolation;

transaction_isolation=READ-UNCOMMITTED
transaction_isolation=READ-COMMITTED
transaction_isolation=REPEATABLE-READ

幻读含义:同一个事物,当前读发生了增量变化

五、InnoDB核心参数
存储引擎:
default_storage_engine=innodb

表空间模式(独立表空间):
innodb_file_per_table=1
共享表空间文件个数和大小:
innodb_data_file_path=ibdata1:512M:ibdata2:512M:autoextend

双一标准:commit时候,redo log buffer刷到磁盘上
innodb_flush_log_at_trx_commit=1

控制 redo log buffer 和 buffer pool:
innodb_flush_method=(O_DIRECT, fsync)
fsync(默认):先刷新到os buffer,再到disk
O_DIRECT(建议):绕过os buffer,直接刷disk

redo日志设置:
innodb_log_buffer_size=16777216(16M)
innodb_log_file_size=50331648(50M)
innodb_log_files_in_group=2(ib_logfile0、ib_logfile1)

脏页刷写策略:
(1)innodb_max_dirty_pages_pct=75
(2)CSR
(3)redo文件满了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值