6、MySQL的存儲引擎 - 系統的擼一遍MySQL

MySQL支持多種不一樣的存儲引擎,而且能夠經過插件的方式進行安裝、包括MySQL官方提供和一些第三方公司的存儲引擎,本文會介紹幾種常見的存儲引擎,介紹每種的特色等。mysql

查看默認的存儲引擎sql

SHOW VARIABLES LIKE 'default_storage_engine';

查看MySQL支持但存儲引擎數據庫

SHOW ENGINES

緩存

SHOW VARIABLES LIKE 'have_%';

MyISAM

曾經MySQL的默認存儲引擎,不支持事務、不支持外鍵、支持全文索引,優點就是訪問速度比較快。工具

存儲文件

主要文件分爲 frm MYD MYI 三種數據類型的文件性能

.frm 中存放了表定義相關的數據,表名與文件名相同,存放在與數據庫名相同的文件夾中spa

.MYD 存放了數據文件插件

.MYI 存放了索引文件code

數據文件和索引文件能夠在建立表結構的時候經過  DATA DIRECTORY 和 INDEX DIRECTORY 來指定,例如:索引

CREATE TABLE test (
id int(11),
title varchar(20)
) ENGINE = MyISAM DATA DIRECTORY = '/data/db' INDEX DIRECTORY = '/data/db';

損壞與修復

MyISAM有可能出現表損壞,這時候須要進行表修復,可使用CHECK TABLE語句來檢查表的健康狀況,若是損壞,使用 REPAIR TABLE 語句修復一個隨壞的MyISAM表。

MyISAM的存儲格式

靜態表:

數據表中的數據都是非變長字段(不存在varchar之類的),這時候每一行數據都長度是固定的,這個時候數據表訪問速度很是迅速,而且容易緩存,出現故障也容易修復,缺點就是會浪費一些存儲空間。

動態表:

包含變長字段的數據表就是動態表,動態表佔用的存儲空間較小,可是頻繁更新刪除會產生碎片,須要按期執行OPTIMIZE TABLE或者 myisamchk -r來改善性能。

壓縮表:

壓縮表使用myisampack工具建立,佔用比較小的硬盤空間。訪問效率很高可是缺點就是隻讀。

InnoDB

InnoDB存儲在MySQL5.5之後已經做爲默認存儲引擎存在。相對MyISAM存儲引擎,InnoDB支持事務、支持外鍵。

AURO_INCREMENT

對於AURO_INCREMENT的字段,在InnoDB表中,可使用聯合索引,可是必須做爲聯合索引的第一列,MyISAM中能夠做爲其他列,可是字段的增加會根據索引前綴的變化而增加(表現爲前綴變化才增加)。

外鍵

InnoDB表支持外鍵管理,能夠給某個索引字段創建外鍵約束。

示例:

CREATE TABLE test(
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(2) NOT NULL DEFAULT '',
`gid` int(11) NOT NULL DEFAULT 0,
KEY gid_idx(`gid`),
PRIMARY KEY(id),
CONSTRAINT 'gid_ref' FOREIGN KEY(`gid`) REFERENCES group(id) ON DELETE RESTRICT ON UPDATE CASECADE
)

經過設置

SET FOREIGN_KEY_CHECKS = 0;

能夠忽略外鍵檢查,以此來加快處理的效率。

存儲方式

InnoDB支持 共享表空間和 獨立表空間兩種存儲方式,能夠經過 innodb_file_per_table 來設置存儲的方式,若是中途更改了存儲方式,更改後的設置只對更改後新建的數據表生效。

共享表空間

共享表空間的存儲,表結構信息存儲在.frm文件中,數據和索引保存在innodb_data_home_dir和innodb_data_file_path制定的文件中,能夠根據後者配置多個自動擴展的文件來分佈IO,可是數據和索引都混合在這個表空間中。

獨立表空間

獨立表空間的存儲,表結構依然在.frm文件中,可是每一個數據和索引存儲在單獨的表空間中,對於分區表來講數據和索引保存在 表名稱+分區名稱.ibd文件中,而且在表分區的時候能夠分不到不一樣的IO設備中。

獨立表空間能夠很是容易的進行單表備份,可是因爲共享表空間的數據字典限制,不能夠直接經過Copy文件的方式來進行數據恢復,須要使用:

ALTER TABLE tbl_name DISCARD TABLESPACE;
ALTER TABLE tbl_name IMPORT TABLESPACE;

將數據恢復到數據庫中,若是須要倒入到某個新的數據庫中,則須要使用mysqldump來實現。

MEMORY

純內存型存儲引擎,數據存儲在內存中,默認使用HASH索引,服務一旦重啓數據就會被清空,同時因爲存儲在內存中,因此存儲的空間大小受內存容量和max_heap_table_size的限制,同時能夠在定義數據表的時候經過MAX_ROWS來限制最大行數。

MERGE

MERGE是一組MyISAM數據表的組合,只是將一組MyISAM表的數據映射到了MERGE表之中,對這個表的操做會做用在對應的MyISAM表之中。

存儲方式

MERGE表使用.frm存儲表定義,同時會額外使用一個.MRG文件來保存組合表的信息,修改這個文件能夠修改MERGE表,可是須要執行FLUSH TABLES來刷新。

數據更新

建立數據表的時候經過 INSERT_METHOD 語句來指定插入操做做用的數據表,其中有NO、FIRST、LAST三個值能夠選擇。

MERGE表沒法智能、均勻但將數據寫道對應表中,因此通常MERGE表用於多個MyISAM表的檢索查詢。

相關文章
相關標籤/搜索