首页 > 数据库 > MySQL > mysql常用存储引擎InnoDB介绍
使用InnoDB存储引擎管理的表具有以下等特点:
InnoDB表空间和日志:
InnoDB操作使用两种基于磁盘的资源:一个存储表内容的表空间和一堆记录事务活动的日志文件。
每个InnoDB表在数据库磁盘目录中拥有一个.frm格式文件。这和由其它MySQL存储引擎管理的表相同,如MyISAM。然而,InnoDB在管理表内容(数据行和索引)在磁盘上的存储和MyISAM存储引擎不同。默认是,InnoDB使用一个共享的“表空间”,其是由一个或多个文件组成的单个逻辑存储区。所有InnoDB表被存储在此表空间中,但并不是如MyISAM表的针对特定表的对应数据文件和索引文件形式。表空间中还包含有一个回滚段(rollback segment)。当事务修改了行数据,undo日志信息会被存储于此回滚段中,这些信息被用于回滚失败的事务。
尽管InnoDB将共享表空间作为一个简单的逻辑存储空间,它可以包含一个或多个文件。每个文件可以是一个普通文件或一个裸分区(raw partition)。在共享表空间中的最终文件可以被设置为可自动扩展,这样当表空间被填满后InnoDB就会自动扩展它们。因为共享表空间被用于所有数据库(非特定数据库)中的InnoDB表,因此表空间文件默认存储与服务端数据文件目录中,而不是某个特定数据库目录下。
如果你希望使用共享表空间来存储表内容,你可以在启动服务端时使用 --innodb_file_per_table项。这样,每个InnoDB建立的新表除了建立表的.frm文件外,对应数据库目录下还会建立特定此表的.ibd文件,此.ibd文件作为其表的自有表空间文件,InnoDB将此表的数据都存在相应的.ibd中。(共享表空间仍然是需要的,因为它包含了InnoDB数据字典和回滚段)
使用 --innodb_file_per_table项并不会影响到任何已经建立在共享表空间中的InnoDB表的可用性,那些表仍然可访问。
除了表空间文件,InnoDB存储引擎还管理了一堆InnoDB特定的日志文件,其包含了关于正进行事务的信息。当客户端执行一个事务,数据的改动会被记录在InnoDB日志中。更新的日志内容被缓存在内存中。一般,缓存的日志信息会在事务commit时被刷出缓存并写入日志文件中,尽管可能写入会发生得更早一些。
如果在表正被更新时发生了崩溃,日志文件就会被用于自动恢复:当MySQL服务端重启,它会将记录与日志中的更新操作重新应用,以保证表反应了所有已经commit的事务。
InnoDB 和 ACID规则:
InnoDB完全满足并支持ACID,并假定其日志flush行为已经做了很好的设置。InnoDB可以对于日志flush进行设置以提供了对ACID的支持,或为了获取更佳的性能但在出现服务端崩溃时有丢失部分最近事务风险的flush设置。默认情况下,InnoDB日志日志flush是设置为遵守ACID规则的。
InnoDB锁:
InnoDB支持在SELECT语句最后加上两种锁修饰符。它们可用于获取共享锁或排它锁(exclusive lock),并可将非带锁读转变为带锁读:
在REPEATALE READ隔离级别,你可以对SELECT语法来增加LOCK IN SHARE MODE语法来强制其它希望修改那些被锁定的行的事务来等待你的事务。这和处于SERIALIZABLE隔离级的操作类似,在SELECT进行查询时候未加显式锁定修饰符,而在SERIALIZABLE隔离级,此SELECT语句句尾会被隐式增加LOCK IN SHARE MODE。
InnoDB隔离级别,多版本控制和并行处理:
之前提到,多个事务可以在服务端并行执行,每个客户端一个事务。这里潜在可能会发生问题:如果一个客户端的事务修改了数据,那么其它客户端的事务是否应该看到那些改变或者说它们是否应该和这些修改保持隔离呢?事务的隔离级别确定了在事务之间可视的级别 —— 即,同时进行的事务之间互相访问相同数据的方式。注意,不同的数据库,其定义也会有不同,因此在InnoDB中实现的隔离级别不可能完全和其它数据库实现的级别功能一致。
当多个客户端同时运行事务时,会出现的3个问题有脏读,非重复读和幻读。InnoDB实现了4中隔离级别来控制事务之间的可视性,它们是:READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ和SERIALIZABLE。
注意:具体隔离级别细节内容已经在《事务》这节中有提到。
InnoDB的优点(缺点正在不断改进中…):
| 优点 |
|
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15498/viewspace-1966778/ ,如需转载,请注明出处,否则将追究法律责任。