MySQL 存储引擎之 Innodb

sqlercn | | 访问(54)

  Innodb 存储引擎的特性

  Innodb 支持事务处理

  Innodb 支持行级锁,行级锁可以最大程度的支持并发

  Innodb 是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

  阻塞

  因为不同锁之间的兼容性关系,所以在有些时刻,一个事务中的锁需要等待另一个事务中的锁释放它所占用的资源。在InnoDB存储引擎的源代码中,用Mutex数据结构来实现锁。在访问资源前需要用mutex_enter函数进行申请,在资源访问或修改完毕后立即执行mutex_exit函数。当一个资源已被一个事务占有时,另一个事务执行mutex_enter函数会发生等待,这就是阻塞。阻塞并不是一件坏事,阻塞是为了保证事务可以并发并且正常运行。

  在InnoDB存储引擎中,参数innodb_lock_wait_timeout用来控制等待的时间(默认是50秒),innodb_rollback_on_timeout用来设定是否在等待超时时对进行中的事务进行回滚操作(默认是OFF,代表不回滚)。

  默认情况下InnoDB存储引擎不会回滚超时引发的错误异常。其实InnoDB存储引擎在大部分情况下都不会对异常进行回滚。

  死锁

  如果程序是串行的,那么不可能发生死锁。死锁只发生于并发的情况,数据库就是一个并发进行着的程序,因此可能会发生死锁。InnoDB存储引擎有一个后台的锁监控线程,该线程负责查看可能的死锁问题,并自动告知用户。

  死锁的一种经典的情况,即A等待B,B在等待A。

  死锁的原因是会话A和B的资源互相在等待。大多数的死锁InnoDB存储自己可以侦测到,不需要人为进行干预。

  但是在上面的例子中,会话B中的事务抛出死锁异常后,会话A中马上得到了记录为2的这个资源,这其实是因为会话B中的事务发生了回滚,否则会话A中的事务是不可能得到该资源的。InnoDB存储引擎并不会回滚大部分的错误异常,但是死锁除外。发现死锁后,InnoDB存储引擎会马上回滚一个事务,这点是需要注意的。如果在应用程序中捕获了1213这个错误,其实并不需要对其进行回滚。

  锁升级

  锁升级(Lock Escalation)是指将当前锁的粒度降低。举例来说,数据库可以把一个表的1 000个行锁升级为一个页锁,或者将页锁升级为表锁。如果数据库的设计中认为锁是一种稀有资源,而且想避免锁的开销,那数据库中会频繁出现锁升级现象。

  MySQL InnoDB 独立表空间模式的优点和缺点介绍

  File-Per-Table的优点:

  1.当表删除或者truncate,空间可以被OS回收。

  2.Truncate table在单个.ibd文件上执行更快。

  3.可以为每个表指定一个特定存储。优化IO,空间管理。CREATE TABLE ... DATA DIRECTORY =absolute_path_to_directory 。

  4.运行OPTIMEIZE TABLE,压缩或者重建创建表空间。运行OPTIMIZE TABLE InnoDB会创建一个新的ibd文件。当完成时,老的表空间会被新的代替。

  5.可以移动单个表,不需要移动整个数据库

  6.可以把表复制到另外一个实例

  7.innodb_file_per_table启动后才能使用Barracuda文件格式。

  8.可以更有效的存储带BLOB,TEXT使用动态行模式的表。

  9.使用innodb_file_per_table可以提高recovery的成功率,减少损坏错误发生恢复的时间。

  10.可以快速的备份,恢复单个表。

  11.innodb_file_per_table 可以从备份中去除一个表

  12.innodb_file_per_table在备份和复制表时,容易观察每个表的状态。

  13.可以通过文件系统直接观察表的大小。

  14.当innodb_flish_method设置为O_DIRECT,通常linux文件系统不允许并发的写入同一个文件。使用innodb_file_per_table就会有性能提升。

  15.不启用innodb_file_per_table,数据都会放在系统表空间中,最大64TB,如果使用innodb_file_per_table每个表可以64TB。

  File-Per-Table的缺点:

  1.表空间中的空间只能被这个表使用

  2.fsync操作必须在每个表上都运行一遍

  3.mysqld必须保持一个打开的文件句柄,表太多会影响性能。

  4.会消耗很多文件描述

  5.innodb_file_per_tablezhiyou 5.6.6或更高版本才能用,有向下兼容问题。

  6.如果很多表都增长,会出现文件碎片问题。导致drop表和表扫描性能下降。

  7.当drop表的时候会扫描buffer pool,如果太大会比较耗时。

  8.innodb_autoextend_increment指定当文件满了之后增长的空间。