MySQL儲存引擎 InnoDB 介紹
一. 概述:
InnoDB儲存引擎提供了具有提交,回滾,和崩潰恢復能力的事務安全,對比MYISAM 的儲存引擎,InnoDB寫的處理效率差一些並且會佔用更多的磁碟空間以保留資料和索引。它的特點有如下:
1. 自動增長列特點 (AUTO_INCREMENT)
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(沒有約束的索引)。
下面演示下Myisam型別的表autoincre_demo, 自動增長列d1作為組合索引第二列。
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')
上面可以看出自增長是按照組合索引的前面幾列進行排序後遞增的。
3. 外來鍵約束
mysql 支援外來鍵的儲存引擎只有innodb,在建立外來鍵的時候,要求父表必須有對應的索引,子表建立外來鍵的時候也會自動建立對應的索引
下面演示兩個表 country 父表country_id列為 主鍵索引, city子表其中country_id列為外來鍵
-- 建立父表
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,並重新啟動服務後生效。 新建的表就按多表空間來儲存,已有表仍然使用共享表空間儲存。
多表空間儲存的優勢是方便進行單表備份和恢復操作,命令如下:
ALTER TABLE tab_name DISCARD TABLESPACE
TABLE TABLE tab_name IMPORT TABLESPACE
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-09/154350.htm