InnoDB(七)-锁
参考文献
MySQL技术内幕 InnoDB存储引擎
https://dev.mysql.com/doc/refman/8.0/en/show-engine.html
锁
lock与latch
latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短.若持续的时间长,则应用的性能会非常差.在InnoDB存储引擎中,latch又可以分为mutex(互斥量)和rwlock(读写锁).其目的是用来保证线程操作临界资源的正确性,并且通常没有死锁检测的机制.
lock的对象是事务,用来锁定的是数据库中的对象,如表,页,行.并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同).lock在大多数数据库中一样,有死锁机制.
lock与latch不同点
lock
latch
对象
事务
线程
保护
数据库内容
内存数据结构
持续时间
整个事务过程
临界资源
模式
行锁,表锁,意向锁
读写锁,互斥量
死锁
通过waits-for graph,time out等机制进行死锁检测
无死锁检测与处理 ...
InnoDB(五)-InnoDB存储结构
参考文献
MySQL技术内幕 InnoDB存储引擎
极客时间–SQL必知必会(陈旸)
索引组织表
在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键(Primary Key),如果在创建表时没有显示地定义主键,则InnoDB存储引擎会按如下方式选择或创建主键:
首先判断表中是否有非空的唯一索引(Unique Not Null),如果有,则该列即为主键.
如果不符合上述条件,InnoDB存储引擎会自动创建一个6字节大小的指针.
当表中有多个非空唯一索引,InnoDB存储引擎将选择建表时第一个定义的非空唯一索引为主键.需要特别注意的是,主键的选择根据的是定义索引的顺序,而不是建表是列的顺序.
123456789create table z( a int not null, b int null, c int not null, d int not null, unique key (b), unique key (d), unique key (c ...
InnoDB(四)-InnoDB文件
参考文献
MySQL技术内幕 InnoDB存储引擎
参数文件
当MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.
可以通过命令SHOW VARIABLES来查看数据中的所有参数,也可以通过LIKE来过滤参数名.从MySQL5.1版本开始,可以通过performance_schema架构下的GLOBAL_VARIABLES视图来进行查找.
12345678910111213141516171819202122232425262728293031323334mysql> select * from global_variables where variable_name like 'innodb_buffer%';+-------------------------------------+----------------+| VARIABLE_NAME | VARIABLE_VALUE |+-------- ...
InnoDB-InnoDB线程
参考文献
千金良方: MySQL性能优化金字塔法则
InnoDB后台线程
123456789101112131415161718192021222324252627282930313233343536373839404142434445mysql> select name,type,thread_id,processlist_id from performance_schema.threads;+---------------------------------------------+------------+-----------+----------------+| name | type | thread_id | processlist_id |+---------------------------------------------+------------+-----------+----------------+| thread/sql/main ...
InnoDB(三)-InnoDB关键特性
参考文献
MySQL技术内幕 InnoDB存储引擎
InnoDB存储引擎的关键特性
插入缓冲(Insert Buffer)
两次写(Double Write)
自适应哈希索引(Adaptive Hash Index)
异步IO(Async IO)
刷新邻接页(Flush Neighbor Page)
Insert Buffer
虽然InnoDB缓冲池中也有Insert Buffer 信息,但是Insert Buffer 和数据页一样,也是物理页的一个组成部分.
在InnoDB存储引擎中,主键是行唯一的标识符.通常应用程序中行记录的插入顺序是按照主键递增的顺序进行插入的.因此,插入聚集索引(Primary Key)一般是顺序的,不需要磁盘的随机读取.
TIPS: 并不是所有的主键插入都是顺序的,若主键类是UUID这样的,那么插入和辅助索引一样,同样是随机的.即使主键是自增类型,但是插入的是指定的值,而不是NULL值,那么同样可能导致插入并非连续的情况.
B+树的特性决定了非聚集索引插入的离散性
解释:
B+树的叶节点是有序的。当它用于聚集索引的时候,叶节点本身既是索引又是 ...
InnoDB(二)-CheckPoint技术
参考文献
MySQL技术内幕 InnoDB存储引擎
Checkpoint技术
缓冲池的设计目的为了协调CPU速度与磁盘速度的鸿沟.因此页的操作首先都是在缓冲池中完成的.如果一条DML语句,如UPDATE或DELETE改变了页中的记录,那么此时页是脏的,即缓冲池中页的版本要比磁盘的新.数据库需要将新版本的页从缓冲池刷新到磁盘.
若每次一个页发生变化,就将新页的版本刷新到磁盘,那么这个开销是非常大的.若热点数据集中在某几个页中,那么数据库的性能将变得非常差.同时,如果在从缓冲池将页的新版本刷新到磁盘时发生了宕机,那么数据就不能恢复了.
为了避免发送数据丢失的问题,当前事务数据库系统都普遍采用了Write Ahead Log策略,即当事务提交时,先写重做日志,再修改页.当由于发生宕机而导致数据丢失时,通过重做日志来完成数据的恢复.
Checkpoint(检查点)技术的目的是解决以下几个问题:
缩短数据库的恢复时间;
缓冲池不够用时,将脏页刷新到磁盘;
重做日志不可用时,刷新脏页;
当数据库发生宕机时,数据库不需要重做所有日志,因为Checkpoint之前的页都已经 ...
InnoDB(一)-InnoDB体系架构
参考文献
MySQL技术内幕 InnoDB存储引擎
https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html
数据库和数据库实例
从概率上说,数据库是文件的集合,是依照某种数据模型组织起来并存放与二级存储其中的数据集合;
数据库实例是程序,是位于用户与操作系统之间的一层数据管理软件,用户对数据库数据的任何操作,包括数据库定义,数据查询,数据维护,数据库运行控制等都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道.
MySQL版本与InnoDB版本对照表
MySQL版本
InnoDB版本
版本开始时间
说明
1.0.x
1996
3.11.1
1996.10
MySQL没有2.x版本
4.0.x
2003
5.1.x
1.0.x版本(官方称为InnoDB Plugin)
5.5.x
1.1.x版本
2010
使用InnoDB作为默认引擎
5.6.x
1.2.x版本
8.0.x
8.0.x
2016
InnoDB体系架构
上 ...