mysql 開發基礎系列10 存儲引擎 InnoDB 介紹

一. 概述:

  InnoDB存儲引擎提供了具備提交,回滾,和崩潰恢復能力的事務安全,對比MYISAM 的存儲引擎,InnoDB寫的處理效率差一些而且會佔用更多的磁盤空間以保留數據和索引。它的特色有以下:mysql

1. 自動增加列特色 (AUTO_INCREMENT)sql

  InnoDB表的自動增加列能夠手工插入,但插入的值若是是空或者是0,則實際插入的將是自動增加的值,下面演示下數據庫

CREATE TABLE autoincre_demo ( i SMALLINT NOT NULL AUTO_INCREMENT, NAME VARCHAR(10), PRIMARY KEY(i) )ENGINE=INNODB INSERT INTO autoincre_demo VALUES(1,'1'),(0,'2'),(NULL,3)

  能夠經過alter table autoincre_demo auto_increment=n 來設置自增加的初使值,該值是保留在內存中,如重啓數據庫這個強制的默認值就會丟失。安全

2. 自動增加與索引服務器

  對於InnoDB表,自動增加列必須是索引,若是是組合索引,也必須是組合索引的第一列。但對於MYISAM 表,自增加列能夠是組合索引的其餘列。
  這裏簡單來講下mysql的索引, 索引的關鍵詞包括: key(普通索引), primary key(主鍵索引),unique key(惟一索引),index(沒有約束的索引)。spa

  下面演示下Myisam類型的表autoincre_demo, 自動增加列d1做爲組合索引第二列。3d

CREATE TABLE autoincre_demo ( d1 SMALLINT NOT NULL AUTO_INCREMENT, d2 SMALLINT NOT NULL, NAME VARCHAR(10), INDEX(d2,d1) )ENGINE=MYISAM INSERT INTO autoincre_demo(d2,NAME) VALUES(2,'2'),(3,'3'),(4,'4'),(2,'2'),(3,'3')

  上面能夠看出自增加是按照組合索引的前面幾列進行排序後遞增的。rest

3. 外鍵約束 code

  mysql 支持外鍵的存儲引擎只有innodb,在建立外鍵的時候,要求父表必須有對應的索引,子表建立外鍵的時候也會自動建立對應的索引
下面演示兩個表 country 父表country_id列爲 主鍵索引, city子表其中country_id列爲外鍵blog

-- 建立父表
CREATE TABLE country ( country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, country VARCHAR(50) NOT NULL, PRIMARY KEY(country_id) )ENGINE=INNODB DEFAULT CHARSET=utf8 -- 建立子表 關聯country_id
CREATE TABLE city ( city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, country_id SMALLINT UNSIGNED NOT NULL , PRIMARY KEY(city_id), KEY idx_fk_country_id (country_id), CONSTRAINT fk_city_country  FOREIGN KEY(country_id)  REFERENCES country(country_id) ON DELETE RESTRICT ON UPDATE CASCADE )ENGINE=INNODB DEFAULT CHARSET=utf8

下面先說下里面的關鍵詞的含義:
  unsigned:表示無符號的意思,也就是非負數,只用於整型。
  key: 爲country_id建個索引,名叫dx_fk_country_id。
  CONSTRAINT:關鍵詞是約束,外鍵約束名叫fk_city_country,FOREIGN KEY是對應的外鍵字段。
  references:是引用country表的country_id字段。
在刪除更新父表時,對子表相應的操做包括restrict,cascade,set null 和no action。
  其中restrict與no action相同 是指限制在:子表有關聯記錄的狀況下父表不能更新; cascade表示父表在更新或者刪除時,同時更新或刪除子表相應記錄。set null則表示在更新或者刪除時,子表對應字段被設置爲null。
瞭解後在看on delete ,restrict 是指:主表刪除記錄時,若是子表有對應記錄,則不容許刪除。
  on update cascade 是指:主表更新記錄時,若是子表有對應記錄,則子表對應更新;

--先維護下數據
INSERT INTO country(country) VALUES('中國'); INSERT INTO city (country_id) VALUES(1);

-- 先試下on delete ,restrict的做用,主表刪除記錄時,若是子表有對應記錄,則不容許刪除
DELETE FROM country WHERE country_id=1

-- 再試下on update cascade 是指主表更新記錄時,若是子表有對應記錄,則子表對應更新;
UPDATE country SET country_id=2 WHERE country_id=1;

  在導入多個表數據時,若是須要忽略以前的導入順序,能夠暫時關閉外鍵的檢查,加快處理速度。

-- 關閉命令是
set foreign_key_checks=0; -- 開啓
set foreign_key_checks=1;

  對於INNODB類型表,外鍵的信息經過使用INFORMATION_SCHEMA查看

SELECT TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA ='test'

4. 存儲方式(簡單瞭解)

         innodb存儲表和索引有兩種方式。

         一是使用共享表空間存儲,這種方式建立的表的表結構保存在.frm文件中,數據和索引保存在innodb_data_home_dir和innodb_data_file_path定義的表空間中,能夠是多個文件。

         二是使用多表空間存儲,這種方式建立的表的表結構保存在.frm文件中,每一個表的數據和索引單獨保存在.ibd中,若是是分區表,則每一個分區對應單獨的.ibd文件,文件名是"表名+分區名"

      須要使用多表空間存儲,須要設置參數innodb_file_per_table,並從新啓動服務後生效。 新建的表就按多表空間來存儲,已有表仍然使用共享表空間存儲。

   多表空間存儲的優點是方便進行單表備份和恢復操做。注意:表結構務必一致,innodb_page_size也要一致,表空間文件遷移命令以下(5.6及以上):

 --目標服務器上刪除舊錶空間文件,執行完這個命令以後,ibd文件就沒有了,只剩frm文件了。
alter table xx discard tablespace;
--源服務器上:將文件cp到目標實例上,修改權限.執行完這個命令以後,表能夠讀取,但沒法修改,metadata lock flush table xx for export
--在目標實例上執行import tablespace。源實例上再unlock tables alter table xx import tablespace;
相關文章
相關標籤/搜索