InnoDB是什么

    InnoDB,是MySQL的数据库引擎之一,与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务 (Transaction)功能,类似于PostgreSQL。

    目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。

    MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表。

    如果没有指定InnoDB配置选项,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为 ib_logfile0和ib_logfile 1的5MB大小的日志文件。

    ibdata1的大小在my.cnf文件中配置:innodb_data_file_path = ibdata1:10G:autoextend

    可以设置最大数据文件限制,以免超过系统支持的最大文件: innodb_data_file_path = ibdata1:100M:autoextend:max:500M

    日志文件大小在my.cnf文件中配置:innodb_log_file_size = 256M innodb_log_files_in_group = 2

    Innodb存储引擎可以使用共享表空间或独立表空间,使用独立表空间时,需要将innodb_file_per_table加到配置文件中,也可以在 variables中开启。

    共享表空间是将所有的表的数据和索引保存在ibdata1中,这样的缺点是拷贝时必须拷贝整个大文件,而且删除表后容易产生碎片。

    独立表空间是为每个表建立一个.ibd文件用来存储数据和.frm用来存数据词典信息,这样,mysql就将innodb表的数据存入各自对应的.ibd 文件中了,但结构等信息还是会写入ibdata。 innodb_file_per_table变量只能在配置文件里修改,不能使用set global … 将innodb_file_per_table关闭之后,建立innoDB表时只生成.frm文件,数据和索引都保存在共享表空间ibdata1中。

    修改默认引擎的方法 修改InnoDB默认引擎:修改配置文件中的default-storage-engine。在配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB

    查看当前数据库默认引擎:show variables like ‘default_storage_engine’

    列出当前数据库所支持到引擎:show engines和show variables like ‘have%’其中Value显示为disabled的记录表示数据库支持此引擎,而在数据库启动时被禁用。

    在MySQL5.1以后,INFORMATION_SCHEMA数据库中存在一个ENGINES的表,它提供的信息与show engines;语句完全一样,可以使用下面语句来查询哪些存储引擎支持事物处理:select engine from information_chema.engines where transactions = ‘yes'; 通过engine关键字在创建或修改数据库时指定所使用到引擎。 


InnoDB特点


    InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是要对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多 的磁盘空间以保留数据和索引。InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。

    Innodb存储引擎管理主要基于两个文件:表空间数据文件和日志文件。

    InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。

    1)自动增长列:   

        InnoDB表的自动增长列可以手工插入,但是插入的如果是空或0,则实际插入到则是自动增长后到值。可以通过”ALTER TABLE…AUTO_INCREMENT=n;”语句强制设置自动增长值的起始值,默认为1,但是该强制到默认值是保存在内存中,数据库重启后该值将会 丢失。可以使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值。如果一次插入多条记录,那么返回的是第一条记录使用的自动增长值。

        对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列,但是对于MyISAM表,自动增长列可以是组合索引的其他列,这 样插入记录后,自动增长列是按照组合索引到前面几列排序后递增的。

    2)外键约束:

      MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

        在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有关联的情况下,父表不能更新;casecade表示父表在更新或删除时,更新或者删除子表对应的记录;set null 则表示父表在更新或者删除的时候,子表对应的字段被set null。   

        当某个表被其它表创建了外键参照,那么该表对应的索引或主键被禁止删除。   

        可以使用set foreign_key_checks=0;临时关闭外键约束,set foreign_key_checks=1;打开约束。

本文转自: http://www.linux78.com/innodb-storage-engine.html
Linux起点