MySQL存儲引擎

MySQL高級-存儲引擎

存儲引擎是基於表的,同一個數據庫不一樣的表可能有不一樣的存儲引擎,在MySQL5.5版本以後,存儲引擎默認是InnoDB,而在以前默認是MyISAM。html

在MySQL中輸入 show engines;能夠查看全部支持的引擎。mysql

show variables like '%storage_engine';能夠查看默認的存儲引擎。sql

在建立表的時候能夠指定存儲引擎 engine關鍵字數據庫

create table goods_innodb(
	id int NOT NULL AUTO_INCREMENT,
	name varchar(20) NOT NULL,
    primary key(id)
)ENGINE=innodb DEFAULT CHARSET=utf8;

在建立以後經過 alter table能夠將一個已經存在的表修改爲其餘的存儲引擎併發

alter table goods_innodb engine = innodb;

InnoDB


​ 最重要也是最普遍的存儲引擎,它被設計用來處理大量短時間事務,短時間事務大部分狀況是正常提交的,不多會被回滾。InnoDB的性能和自動崩潰恢復的特性,使得它在非事務型存儲的需求中也不多流行。除非有很是特別的緣由須要使用其餘引擎。性能

可是對比 MyISAM 的存儲引擎,InnoDB 寫的處理效率差一些而且會佔用更多的磁盤空間以保留數據和索引。插件

特色:支持事務、行級鎖、外鍵設計

1.支持事務

在MySQL中執行語句會默認提交,由於是沒有開啓事務的,在使用InnoDB引擎開啓事務以後,新增一條數據3d

start TRANSACTION;//開啓事務
INSERT INTO city(city_name,country_id) VALUES('岳陽',4);

數據庫仍是查詢不到,commit提交以後數據庫才能查詢到日誌

2.外鍵約束

InnoDB引擎提供了四個約束外鍵的方式

RESTRICTNO ACTION:是指限制在子表有關聯記錄的狀況下, 父表不能更新;

CASCADE:表示父表在更新或者刪除時,更新或者刪除子表對應的記錄;

SET NULL: 則表示父表在更新或者刪除的時候,子表的對應字段被SET NULL 。

在有外鍵的狀況下,導入數據能夠先關閉外鍵檢查,再從新打開

SET FOREIGN_KEY_CHECKS = 0;//關閉外鍵檢查
SET FOREIGN_KEY_CHECKS = 1;//打開外鍵檢查

下面兩張表,country是主表,city是父表,

CREATE table country//新建國家表
 (
   countryID int NOT NULL AUTO_INCREMENT,//自動增加
    countryName varchar(100) NOT NULL,
    primary key(countryID)//主鍵
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE table city//新建城市表
(
    cityID int not NULL AUTO_INCREMENT,
		cityName VARCHAR(50) not NULL,
		countryID int ,
		key idx_fk_country_id(countryID),//索引
		PRIMARY key(cityID),
		CONSTRAINT `fk_city_country` FOREIGN KEY(countryID) REFERENCES //外鍵 
       //設置了子表刪除的時候父表不能更新,父表在更新的時候也更新子表的記錄
		country(countryID) ON DELETE RESTRICT ON UPDATE CASCADE  
)ENGINE=INNODB DEFAULT charset=utf8;
INSERT into country(countryName) values('中國'),('新西蘭');
INSERT into  city(cityName,countryID) VALUES('長沙',1),('北京',1);

刪除countryID=1的數據

DELETE FROM country WHERE countryID=1

更新父表的countryID爲10

子表數據變動爲

3.存儲方式

MySQL數據庫數據默認存儲在 /var/lib/mysql/下,能夠進去查看信息

InnoDB存儲表和索引有如下兩種方式:

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

能夠比較方便地進行單表備份和恢復操做,可是直接復 制.ibd 文件是不行的,由於沒有共享表空間的數據字典信息,直接複製的.ibd 文件和.frm 文 件恢復時是不能被正確識別的,但能夠經過如下命令:

ALTER TABLE 表名 DISCARD TABLESPACE;
ALTER TABLE 表名 IMPORT TABLESPACE;

可是備份恢復默認只能恢復到以前的數據庫,,若是要恢復到其餘數據庫須要經過 mysqldump 和 mysqlimport 來實現。

即使在多表空間的存儲方式下,共享表空間仍然是必須的,InnoDB 把內部數據詞典和日誌放在這個文件中。


MyISAM

​ 不支持事務也不支持外鍵,對事物的完整性沒有要求或者以select、insert爲主的應用基本均可以使用這個引擎。

特色:訪問速度快

每一個 MyISAM 在磁盤上存儲成 3 個文件,其文件名都和表名相同,但擴展名分別是:

  • .frm(存儲表定義)
  • .MYD(MYData,存儲數據)
  • .MYI (MYIndex,存儲索引)

數據文件和索引文件能夠放置在不一樣的目錄,平均分佈 IO,得到更快的速度。


MEMORY

MEMORY 存儲引擎使用存在內存中的內容來建立表。每一個 MEMORY 表只實際對應一個 磁盤文件,格式是.frm。MEMORY 類型的表訪問很是得快,由於它的數據是放在內存中的, 而且默認使用 HASH 索引,可是一旦服務關閉,表中的數據就會丟失掉。

在建立表的時候要在 CREATE TABLE語句中指定子句,能夠用 max_heap_table_size來設置表的大小進行擴容,表的默認大小是16MB。子句的意思有點像子查詢,從其餘表取數據。

CREATE TABLE tab_memory ENGINE=MEMORY
(
 SELECT city_id,city,country_id FROM city GROUP BY city_id;
)
SET max_heap_table_size = 1024*1024*2;

建立索引的時候,能夠指定使用 HASH 索引仍是 BTREE 索引:

create index mem_hash USING HASH on tab_memory (city_id) ;

MEMORY 類型的存儲引擎主要用在那些內容變化不頻繁的代碼表,或者做爲統計操做 的中間結果表,便於高效地對中間結果進行分析並獲得最終的統計結果。


MERGE

MARGE是一組MyISAM表的組合,這些表的結構必須徹底相同,MERGE表自己沒有數據,可是能夠對該表進行查詢,更新、刪除。DROP刪除MARGE表時不會對其餘表數據形成影響。

使用MARGE建立表citys_all

create table city1(
	city1_id int  not NULL AUTO_INCREMENT,
	city_name varchar(50),
	primary key (city1_id)
)engine = myisam default charset=utf8;

create table city2(
	city2_id int not NULL AUTO_INCREMENT,
	city_name varchar(50),
	primary key (city2_id)
)engine = myisam default charset=utf8;

create table citys_all(
	city_id int ,
	city_name varchar(50),
	primary key (city_id)
)engine = merge union = (city1,city2) INSERT_METHOD=LAST default charset=utf8;

INSERT into city1(city_name) values('長沙'),('北京');
INSERT into city2(city_name) values('上海'),('深圳');

INSERT_METHOD 插入表能夠有三個不一樣的值

  • FIRST:使得插入操做在第一個表

  • LAST:使得插入操做在最後一個表

  • NO:不能對錶進行插入操做

查詢city1表

查詢city2表

查詢citys_all表

往citys_all中插入一條數據,由於建立該表時定義的是INSERT_METHOD=LAST,因此會在最後一張表city2中插入。

insert into citys_all values(3,'海口');


存儲引擎的選擇

下面是經常使用存儲引擎的適用環境。

  • MyISAM:默認的 MySQL 插件式存儲引擎。若是應用是以讀操做和插入操做爲主, 122 只有不多的更新和刪除操做,而且對事務的完整性、併發性要求不是很高,那麼選擇這個存 儲引擎是很是適合的。MyISAM 是在 Web、數據倉儲和其餘應用環境下最常使用的存儲引擎 之一。
  • InnoDB:用於事務處理應用程序,支持外鍵。若是應用對事務的完整性有比較高的 要求,在併發條件下要求數據的一致性,數據操做除了插入和查詢之外,還包括不少的更新、 刪除操做,那麼 InnoDB 存儲引擎應該是比較合適的選擇。InnoDB 存儲引擎除了有效地下降 因爲刪除和更新致使的鎖定,還能夠確保事務的完整提交(Commit)和回滾(Rollback), 對於相似計費系統或者財務系統等對數據準確性要求比較高的系統,InnoDB 都是合適的選 擇。
  • MEMORY:將全部數據保存在 RAM 中,在須要快速定位記錄和其餘相似數據的環境 下,可提供極快的訪問。MEMORY 的缺陷是對錶的大小有限制,太大的表沒法 CACHE 在內 存中,其次是要確保表的數據能夠恢復,數據庫異常終止後表中的數據是能夠恢復的。 MEMORY 表一般用於更新不太頻繁的小表,用以快速獲得訪問結果。
  • MERGE:用於將一系列等同的 MyISAM 表以邏輯方式組合在一塊兒,並做爲一個對象 引用它們。MERGE 表的優勢在於能夠突破對單個 MyISAM 表大小的限制,而且經過將不一樣 的表分佈在多個磁盤上,能夠有效地改善MERGE表的訪問效率。這對於諸如數據倉儲等VLDB 環境十分適合
相關文章
相關標籤/搜索