×

Innodb存储引擎-idb文件格式解析

前端技术网 前端技术网 发表于2024-01-21 13:22:18 浏览3055 评论0

抢沙发发表评论

一、mysql innodb存储引擎行级锁问题

概念:

锁是用来管理对共享文件的并发访问。innodb会在行级别上对数据库上锁。不过innodb存储引擎会在数据库内部其他多个地方使用锁,从而允许对不同资源提供并发访问。例如操作缓冲池中的LRU列表,删除,添加,移动LRU列表中的元素,为了保证一致性,必须有锁的介入。MyISAM引擎是表锁,而InnoDB提供一致性的非锁定读、行级锁,且行级锁没有相关额外的开销。

Innodb存储引擎-idb文件格式解析

table-level locking(表级锁)

整个表被客户锁定。根据锁定的类型,其他客户不能向表中插入记录,甚至从中读数据也受到限制MyISAM、MEMORY默认锁级别,个别时候,InnoDB也会升级为表级锁

row-level locking(行级锁)

只有线程当前使用的行被锁定,其他行对于其他线程都是可用的InnoDB默认行级锁。是基于索引数据结构来实现的,而不是像ORACLE的锁,是基于block的。InnoDB也会升级为表级锁,全表/全索引更新,请求autoinc锁等

page-level locking(页级锁)

Innodb存储引擎-idb文件格式解析

锁定表中某些行**(称做页),被锁定的行只对锁定最初的线程是可行。如果另外一个线程想要向这些行写数据,它必须等到锁被释放。不过其他页的行仍然可以使用BDB默认页级锁

lock与latch

latch称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB存储引擎中,又可以分为mutex(互斥量)和rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。latch可以通过命令show engine innodb mutex来进行查看。如图:

由上图可以看出列Type显示的总是InnoDB,列Name显示latch的信息以及所在源码的行数,列Status中显示的os_waits表示操作系统等待的次数。

lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或者rollback后释放(不同事务隔离级别释放的时间可能不一样)。有死锁机制。二则的区别如下:

特点:

InnoDB是通过对索引上的索引项加锁来实现行锁。这种特点也就意味着,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

锁的类型:

有两种标准的行级锁:

共享锁(S lock):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁.SELECT* FROM table_name WHERE... LOCK IN SHARE MODE

排它锁(X lock):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他锁.SELECT* FROM table_name WHERE... FOR UPDATE

InnoDB存储引擎支持意向锁且设计比较简练,分为两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。(意向锁是InnoDB自动加的)

意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁.

意向独占锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁.

二、MySQL技术内幕:InnoDB存储引擎的目录

推荐序

前言

致谢

第1章 mysql体系结构和存储引擎

1.1定义数据库和实例

1.2.mysql体系结构

1.3 mysql表存储引擎

1.3.1 innodb存储引擎

1.3.2 mylsam存储引擎,

1.3.3 ndb存储引擎

1.3.4 memory存储引擎

1.3.5 archive存储引擎

1.3.6 federated存储引擎

1.3.7 maria存储引擎

1.3.8其他存储引擎

1.4各种存储引擎之间的比较

1.5连接mysql

1.5.1 tcp/ip

1.5.2命名管道和共享内存

1.5.3 unix域套接宇

.1.6小结

第2章 innodb存储引擎

2.1.innodb存储引擎概述

2.2 innodb体系架构

2.2.1后台线程

2.2.2内存

2.3 masteithread

2.3.1 masterthread源码分析

2.3.2 masterthread的潜在问题

2.4关键特性

2.4.1插入缓冲

2.4.2两次写

2.4.3自适应哈希索引

2.5启动、关闭与恢复

2.6 innodbplugin:新版本的innodb存储

引擎

2.7小结

第3章文件

3.1参数文件

3.1.1什么是参数

3.1.2参数类型

3.2日志文件

3.2.1错误日志

3.2.2慢查询日志

3.2.3查询日志

3.2.4二进制日志

3.3套接字文件

3.4 pid文件

3.5表结构定义文件

3.6 innodb存储引擎文件

3.6.1表空间文件

3.6.2重做日志文件

3.7小结

第4章表

4.1 innodb存储引擎表类型

4.2 innodb逻辑存储结构

4.2.1表空间

4.2.2段

4.2.3区

4.2.4页

4.2.5行

4.3 innodb物理存储结构

4.4 innodb行记录格式

4.4.1 compact行记录格式

4.4.2 redundant行记录格式

4.4.3行溢出数据

4.4.4 compressed与dynamic行记录格式

4.4.5 char的行结构存储

4.5 innodb数据页结构

4.5.1 fileheader

4.5.2 pageheader

4.5.3 infimum和supremum记录

4.5.4 userrecords与freespace

4.5.5 pagedirectory

4.5.6 filenailei

4.5.7 innodb数据页结构示例分析

4.6 namedfileformats

4.7约束

4.7.1数据完整性

4.7.2约束的创建和查找

4.7.3约束和索引的区别

4.7.4对于错误数据的约束

4.7.5 enum和set约束

4.7.6触发器与约束

4.7.7外键

4.8视图

4.8.1视图的作用

4.8.2物化视图

4.9分区表

4.9.1分区概述

4.9.2 range分区

4.9.3 list分区

4.9.4 hash分区

4.9.6 columns分区

4.9.7子分区

4.9.8分区中的null值

4.9.9分区和性能

4.10小结

第5章索引与算法

5.1 innodb存储引擎索引概述

5.2二分查找法

5.3平衡二叉树

5.4 b+树

5.4.1 b+树的插入操作

5.4.2 b+树的删除操作

5.5 b+树索引

5.5.1聚集索引

5.5.2辅助索引

5.5.3 b+树索引的管理

5.6 b+树索引的使用

5.6.1什么时候使用b+树索引

5.6.2顺序读、随机读与预读取

5.6.3辅助索引的优化使用

5.6.4联合索引

5.7哈希算法

5.7.1哈希表

5.7.2 innodb存储引擎中的哈希算法

5.7.3自适应哈希索引

5.8小结

第6章锁

6.1什么是锁

6.2 innodb存储引擎中的锁

6.2.1锁的类型

6.2.2一致性的非锁定读操作

6.2.3 selectforupdp/te&selectlockinsharemode

6.2.4自增长和锁

6.2.5外键和锁

6.3锁的算法

6.4锁问题

6.4.1丢失更新

6.4.2脏读

6.4.3不可重复读

6.5阻塞

6.6死锁

6.7锁升级

6.8小结

第7章事务

7.1事务概述

7.2事务的实现

7.2.1 redo

7.2.2 undo

7.3事务控制语句

7.4隐式提交的sql语句

7.5对于事务操作的统计

7.6事务的隔离级别

7.7分布式事务

7.8不好的事务习惯

7.8.1在循环中提交

7.8.2使用自动提交

7.8.3使用自动回滚

7.9小结

第8章备份与恢复

第9章性能调优

第10章 innodb存储引擎源代码的编译

三、请说说mysql 的存储引擎,myisam和innodb的区别

MyISAM和InnoDB的七大区别:

1、MySQL默认采用的是MyISAM。MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

2、InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。

3、InnoDB支持外键,MyISAM不支持。

4、InnoDB的主键范围更大,最大是MyISAM的2倍。

5、InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。

6、MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。

7、没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。

文章分享结束,Innodb存储引擎-idb文件格式解析和MySQL技术内幕:InnoDB存储引擎的目录的答案你都知道了吗?欢迎再次光临本站哦!