InnoDB

2020-05-17  本文已影响0人  Yves_Chen
InnoDB

MySQL-InnoDB

架构

CheckPoint

已经被flush到页上的LSN。

刷盘策略

Sharp CheckPoint

Fuzzy CheckPoint

后台线程

Master Threads

IO Threads

Purge Threads

Page Cleaner Threads

内存

缓冲池

List

redo log buffer

other buffer

double write

先将脏页memcpy到共享表空间128个连续页,刷盘

再将脏页刷盘

写到一半宕机,根据连续页数据恢复

为什么redoLog不能恢复?

当物理页损坏时,redolog只记录了物理页的更改,无法恢复,但doublewrite的共享表空间buffer记录了页的完整备份。

若下层存储如LUN或FS提供了此功能,数据库中应关闭

文件

数据库文件

Innodb文件

innodb逻辑存储结构

Index

存储引擎选择不使用索引的原因

当使用辅助索引不能返回所有需要查询的列时,会通过辅助索引查到主键值,在通过主键值使用聚集索引查找完整列,由于经过了辅助索引后,再访问聚集索引,在需要查询的记录量比较大时,会产生大量随机IO,在机械盘的情况下,性能会大大降低,这时优化器可能选择直接遍历聚集索引(顺序IO)。

但在需要查询的记录量比较小时,可能依然先使用辅助索引,或者在SSD盘的情况下,用户可设置先使用辅助索引。
select * from table force index(.)...

MRR优化

在通过辅助索引查询大量记录的时候,MRR优化先将辅助索引查询得来的主键ID排序,再通过主键ID顺序查询记录整行记录,以此将随机IO转换为顺序IO;
另外,MRR可以将范围查询拆分为键值对查询,如 select * from t where idx1 >= 1000 and idx1 << 2000 and idx2 = 10000;
其中(idx1,idx2)为联合索引。
MRR将会过滤掉idx2 = 10000的数据,只取出满足查询条件的主键ID页,否则将先返回满足idx1条件的数据,再在内存中过滤掉idx2条件。。。

Index Condition Pushdown

Mysql5.6之后将Index Filter 过滤条件在innodb存储引擎索引层面过滤,5.6之前是只使用Index first key和Index last key查询记录,再将记录返回到server层过滤。

Innodb根据事务访问的每个页对锁进行管理,采用位图的方式,锁住一页中的一条记录和多条记录开销差不多。

自增长列

外键

对子表插入记录时,会先select父表,查看父表是否存在相应的外键值,此时select不再读快照,而是采用select ... lock in share mode的方式,若此时父表相应外键已经被加了X锁,则子表的插入阻塞。

这样是为了防止死锁,若select 父表采用快照读,则会读到已经加了X锁记录的快照,然后完成对子表的插入,之后加X锁的事务再修改外键,造成子表父表外键对应不上。

调优

CPU

OLTP应用属于IO密集型,采购设备应更关注IO能力强的配置。
根据CPU支持的核数,设置数据库线程(purge,IO等)的数量,由于是IO密集型,可适当调整线程为核的两倍。

内存

预估数据库“活跃”数据量。
判断内存是否达到瓶颈:
缓冲池命中率>99%

硬盘/SSD

RAID/阵列

测试工具

XMind - Trial Version

上一篇 下一篇

猜你喜欢

热点阅读