数据库存储引擎,是不同的存储技术将数据存储在文件或者内存当中,这些存储引擎当中每种都会使用不同的技术来进行数据的存储,索引技巧实现,或者说数据库锁的实现,通过这些不同的技巧来最终达到一定的效果。
主要来看下我们比较经常使用的InnerDB
InnerDB
InnerDB是一个事务型的存储引擎,主要是目的是大数据时提供高性能的数据服务,在运行时在内存当中建立缓冲池,用来缓冲数据和索引。
InnerDB的特点:
1、支持事务处理、ACID事务特性
2、实现了SQL标准的四种隔离级别
3、支持行级锁和外键约束
4、可以利用事务日志进行数据恢复
5、不支持FullText类型的索引,没有保存数据库行数,计算count(*)需要全局扫描
6、支持自动增加列属性auto_increment
7、最后也是非常重要的一点:InnerDB是为了处理大量数据时的最大性能设计,其CPU效率可能是其他基于磁盘的关系型数据库所不能匹敌的。
在以下两点情况下必须使用InnerDB
1、可靠性高或者必须要求事务处理
2、表更新和查询相当的频繁,并且表锁定的机会比较大的情况下,指定InnerDB存储引擎。
InnerDB引擎的索引实现:
InnerDB引擎的索引结构是B+树的实现方式。InnerDB的索引文件存储的包括数据文件,所以B+Tree树当中叶子节点中存储的就是实际数据,其实这种索引就是聚集索引。
InnerDB的辅助索引存储域存储的也是记录相应主键的值不是地址,所以当使用辅助索引查找时,会先通过辅助索引找到主键,再根据主键索引找到实际的数据。InnerDB不建议使用过长的主键,否则会使辅助索引变得很大。
因为InnerDB的数据本身要按照主键进行聚集,所以InnerDB必须要有主键,如果没有显示指定,InnerDB会自动选择可以唯一标识的列作为主键,如果不存在这样的列,InnerDB会隐式生成一个隐含字段,作为主键。
InnerDB的辅助索引data域当中存储的值是主键的值而不是地址,InnerDB的辅助索引都是用主键作为data域。
InnerDB引擎索引的查找步骤为:将主键组织到B+树上,行数据存储在B+树的叶子节点上,如果使用主键检索,会通过主键检索到叶子节点,然后获得行数据。如果对name进行检索,会在辅助索引B+树上检索name,找到其叶子节点,获得相应的主键,第二步使用主键在B+树当中再执行一次检索,最终到达叶子节点,获取整行数据。
数据存储:MySQL之InnoDB如何实现事务
innodb 通过buffer pool, logBuffer, Redo Log, Undo Log 来实现事务的, 以update语句举例:
innodb 在收到一个update语句后, 会先根据条件找到数据所在的页, 并将该页缓存在buffer pool中
执行update语句, 修改buffer pool中的数据, 即内存中的数据
针对update语句生成一个redoLog对象, 并存入LogBuffer中
针对update语句生成undo Log日志, 用于事务回滚
如果事务提交, 那么则把redo Log对象及逆行持久化, 后续还有其他机制将buffer pool中修改的数据页持久化到磁盘中
如果事务回滚, 则利用undo log 日志进行回滚
Force log at commit机制
1.当事务提交时,必须先将该事务的所有日志写入到日志文件进行持久化,之后完成COMMIT。
2.日志写入日志文件时,日志缓冲先写入文件系统缓存,为了确保写入磁盘,需要调用一次fsync操作。
3.由于fsync的效率取决于磁盘的性能,因此磁盘的性能决定了事务提交的性能,也就是数据库的性能。fsync会同步内存中所有已修改的文件数据到磁盘。
innodb数据恢复
1、恢复原数据库的配置文件:包括日志大小 文件路径等
2、在[mysqld]段中增加:innodb_force_recovery = 4
3、可以在另外地方建立新的数据库并用原表的结构创建表
4、将上一步中建立的.frm表文件拷贝到准备恢复的数据库中
5、启动数据库
6、停止数据库 注释掉innodb_force_recovery = 4项
7、重新启动数据库,应该可以用mysqldump导出数据了
表结构文件应该可以凭借你的记忆恢复关键是ibdata数据完好 用导出的sql重新入库