存儲引擎是基於表的,同一個數據庫不一樣的表可能有不一樣的存儲引擎,在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的性能和自動崩潰恢復的特性,使得它在非事務型存儲的需求中也不多流行。除非有很是特別的緣由須要使用其餘引擎。性能
可是對比 MyISAM 的存儲引擎,InnoDB 寫的處理效率差一些而且會佔用更多的磁盤空間以保留數據和索引。插件
特色:支持事務、行級鎖、外鍵設計
在MySQL中執行語句會默認提交,由於是沒有開啓事務的,在使用InnoDB引擎開啓事務以後,新增一條數據3d
start TRANSACTION;//開啓事務
INSERT INTO city(city_name,country_id) VALUES('岳陽',4);
數據庫仍是查詢不到,commit
提交以後數據庫才能查詢到日誌
InnoDB引擎提供了四個約束外鍵的方式
RESTRICT、NO 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
子表數據變動爲
MySQL數據庫數據默認存儲在 /var/lib/mysql/
下,能夠進去查看信息
InnoDB存儲表和索引有如下兩種方式:
能夠比較方便地進行單表備份和恢復操做,可是直接復 制.ibd 文件是不行的,由於沒有共享表空間的數據字典信息,直接複製的.ibd 文件和.frm 文 件恢復時是不能被正確識別的,但能夠經過如下命令:
ALTER TABLE 表名 DISCARD TABLESPACE; ALTER TABLE 表名 IMPORT TABLESPACE;
可是備份恢復默認只能恢復到以前的數據庫,,若是要恢復到其餘數據庫須要經過 mysqldump 和 mysqlimport 來實現。
即使在多表空間的存儲方式下,共享表空間仍然是必須的,InnoDB 把內部數據詞典和日誌放在這個文件中。
不支持事務也不支持外鍵,對事物的完整性沒有要求或者以select、insert爲主的應用基本均可以使用這個引擎。
特色:訪問速度快
每一個 MyISAM 在磁盤上存儲成 3 個文件,其文件名都和表名相同,但擴展名分別是:
數據文件和索引文件能夠放置在不一樣的目錄,平均分佈 IO,得到更快的速度。
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 類型的存儲引擎主要用在那些內容變化不頻繁的代碼表,或者做爲統計操做 的中間結果表,便於高效地對中間結果進行分析並獲得最終的統計結果。
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,'海口');
下面是經常使用存儲引擎的適用環境。