InnoDB概述
InnoDB給MySQL提供了具有提交,回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。InnoDB鎖定在行級并且也在SELECT語句提供一個Oracle風格一致的非鎖定讀。這些特色增加了多用戶部署和性能。沒有在InnoDB中擴大鎖定的需要,因為在InnoDB中行級鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合。
InnoDB是為處理巨大數據量時的最大性能設計。它的CPU效率可能是任何其它基于磁盤的關系數據庫引擎所不能匹敵的。
InnoDB存儲引擎被完全與MySQL服務器整合,InnoDB存儲引擎為在主內存中緩存數據和索引而維持它自己的緩沖池。InnoDB存儲它的表&索引在一個表空間中,表空間可以包含數個文件(或原始磁盤分區)。這與MyISAM表不同,比如在MyISAM表中每個表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統上。
InnoDB默認地被包含在MySQL二進制分發中。Windows Essentials installer使InnoDB成為Windows上MySQL的默認表。
InnoDB被用來在眾多需要高性能的大型數據庫站點上產生。著名的Internet新聞站點Slashdot.org運行在InnoDB上。Mytrix, Inc.在InnoDB上存儲超過1TB的數據,還有一些其它站點在InnoDB上處理平均每秒800次插入/更新的負荷。
InnoDB配置
InnoDB存儲引擎是默認地被允許的。如果你不想用InnoDB表,你可以添加skip-innodb選項到MySQL選項文件。
被InnoDB存儲引擎管理的兩個重要的基于磁盤的資源是InnoDB表空間數據文件和它的日志文件。
如果你指定無InnoDB配置選項,MySQL將在MySQL數據目錄下創建一個名為ibdata1的10MB大小的自動擴展數據文件,以及兩個名為ib_logfile0和ib_logfile
注釋:InnoDB給MySQL提供具有提交,回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。如果擬運行的操作系統和硬件不能如廣告說的那樣運行,InnoDB就不能實現如上能力。許多操作系統或磁盤子系統可能為改善性能而延遲或記錄寫操作。在一些操作系統上,就是系統調用(fsync()) 也要等著,直到所有未寫入已被刷新文件的數據在被刷新到穩定內存之前可以確實返回了。因為這個,操作系統崩潰或掉電可能損壞當前提交的數據,或者在最壞的 情況,因為寫操作已被記錄了,甚至破壞了數據庫。如果數據完整性對你很重要,你應該在用任何程序于生產中之前做一些“pull-the-plug”測試。Mac OS X 10.3 及以后版本,InnoDB使用一個特別的fcntl()文件刷新方法。在Linux下,建議禁止回寫緩存。
在ATAPI硬盤上,一個類似hdparm -W0 /dev/hda命令可能起作用。小心某些驅動器或者磁盤控制器可能不能禁止回寫緩存。
注釋:要獲得好的性能,你應該如下面例子所討論那樣,明確提供InnoDB參數。自然地,你應該編輯設置來適合你的硬件和要求。
要建立InnoDB表空間文件,在my.cnf選項文件里的[mysqld]節里使用innodb_data_file_path選項。在Windows上,你可以替代地使用my.ini文件。innodb_data_file_path的值應該為一個或多個數據文件規格的列表。如果你命名一個以上的數據文件,用 分號(‘;’)分隔它們:
innodb_data_file_path=datafile_spec1[;datafile_spec2]...
例如:把明確創建的具有相同特征的表空間作為默認設置的設置操作如下:
[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend
這個設置配置一個可擴展大小的尺寸為10MB的單獨文件,名為ibdata1。沒有給出文件的位置,所以默認的是在MySQL的數據目錄內。
尺寸大小用M或者G后綴來指定說明單位是MB或者GB。
一個表空間,它在數據目錄里包含一個名為ibdata1的固定尺寸50MB的數據文件和一個名為ibdata2大小為50MB的自動擴展文件,其可以像這樣被配置:
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
一個指定數據文件的完全后綴包括文件名,它的尺寸和數個可選屬性:
file_name:file_size[:autoextend[:max:max_file_size]]
autoextend屬性和后面跟著的屬性只可被用來對innodb_data_file_path行里最后一個數據文件。
如果你對最后的數據文件指定autoextend選項。如果數據文件耗盡了表空間中的自由空間,InnoDB就擴展數據文件。擴展的幅度是每次8MB。
InnoDB并不感知最大文件尺寸,所以要小心文件系統,在那上面最大的文件尺寸是2GB。要為一個自動擴展數據文件指定最大尺寸,請使用max屬性。下列配置允許ibdata1漲到極限的500MB:
[mysqld]innodb_data_file_path=ibdata1:10M :autoextend:max:500M InnoDB默認地在MySQL數據目錄創建表空間文件。要明確指定一個位置,請使用innodb_data_home_dir選項。比如,要使用兩個名為ibdata1和ibdata2的文件,但是要把他們創建到/ibdata,像如下一樣配置InnoDB:
[mysqld]innodb_data_home_dir = /ibdatainnodb_data_file_path=ibdata1:50M ;ibdata2:50M :autoextend注釋:InnoDB不創建目錄,所以在啟動服務器之前請確認/ibdata目錄的確存在。這對你配置的任何日志文件目錄來說也是真實的。使用Unix或DOS的mkdir命令來創建任何必需的目錄。
通過把innodb_data_home_dir的值原原本本地部署到數據文件名,并在需要的地方添加斜杠或反斜杠,InnoDB為每個數據文件形成目錄路徑。如果innodb_data_home_dir選項根本沒有在my.cnf中提到,默認值是“dot”目錄 ./,這意思是MySQL數據目錄。
處理InnoDB初始化問題
語句取回的值逐次加一,并被賦給列和自動增長計數器。如果表是空的,值1被賦予該列。如果自動增長計數器沒有被初始化,而且用戶調用為表T顯示輸出的SHOW TABLE STATUS語句,則計數器被初始化(但不是增加計數)并被存儲以供隨后的插入使用。注意,在這個初始化中,我們對表做一個正常的獨占讀鎖定,這個鎖持續到事務的結束。
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
外鍵定義服從下列情況:
PRIMARY KEY (id)
) TYPE=INNODB;
CREATE TABLE child(id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
) TYPE=INNODB;
如下是一個更復雜的例子,其中一個product_order表對其它兩個表有外鍵。一個外鍵引用一個product表中的雙列索引。另一個引用在customer表中的單行索引:
price DECIMAL,
PRIMARY KEY(category, id)) TYPE=INNODB;
CREATE TABLE customer (id INT NOT NULL,
PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY(no),
INDEX (product_category, product_id),
FOREIGN KEY (product_category, product_id)
REFERENCES product(category, id)
ON UPDATE CASCADE ON DELETE RESTRICT,
INDEX (customer_id),
FOREIGN KEY (customer_id)
REFERENCES customer(id)) TYPE=INNODB;
InnoDB允許你用ALTER TABLE往一個表中添加一個新的外鍵約束:
ADD [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
記住先創建需要的索引。你也可以用ALTER TABLE往一個表添加一個自引用外鍵約束。
當年創建一個外鍵之時,如果FOREIGN KEY子句包括一個CONSTRAINT名字,你可以引用那個名字來移除外鍵。另外,當外鍵被創建之時,fk_symbol值被InnoDB內部保證。當你想要移除一個外鍵之時,要找出標記,請使用SHOW CREATE TABLE語句。例子如下:
*************************** 1. row ***************************
Table: ibtest11c
Create Table: CREATE TABLE `ibtest11c` (
`A` int(11) NOT NULL auto_increment,
`D` int(11) NOT NULL default '0',
`B` varchar(200) NOT NULL default '',
`C` varchar(175) default NULL,
PRIMARY KEY (`A`,`D`,`B`),
KEY `B` (`B`,`C`),
KEY `C` (`C`),
CONSTRAINT `0_38775` FOREIGN KEY (`A`, `D`)
REFERENCES `ibtest11a` (`A`, `D`)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `0_38776` FOREIGN KEY (`B`, `C`)
REFERENCES `ibtest11a` (`B`, `C`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB CHARSET=latin1
1 row in set (0.01 sec)
mysql> ALTER TABLE ibtest11c DROP FOREIGN KEY 0_38775;
InnoDB解析程序允許你在FOREIGN KEY ... REFERENCES ...子句中用`(backticks)把表和列名名字圍起來。InnoDB解析程序也考慮到lower_case_table_names系統變量的設置。
從這個版本起,mysqldump也將表的正確定義生成到轉儲文件中,且并不忘記外鍵。
外鍵約束被列在輸出的Comment列。
mysql> SOURCE dump_file_name;
mysql> SET FOREIGN_KEY_CHECKS = 1;
如果轉儲文件包含對外鍵是不正確順序的表,這就以任何順序導入該表。這樣也加快導入操作。設置FOREIGN_KEY_CHECKS為0,對于在LOAD DATA和ALTER TABLE操作中忽略外鍵限制也是非常有用的。
新聞熱點
疑難解答