官網:https://dev.mysql.com/doc/refman/5.6/en/storage-engines.html
html
Table 16.1 Storage Engines Feature Summary mysql
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
Storage limits | 256TB | RAM | 64TB | None | 384EB |
Transactions | No | No | Yes | No | Yes |
Locking granularity | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
Geospatial data type support | Yes | No | Yes | Yes | Yes |
Geospatial indexing support | Yes | No | Yes[a] | No | No |
B-tree indexes | Yes | Yes | Yes | No | No |
T-tree indexes | No | No | No | No | Yes |
Hash indexes | No | Yes | No[b] | No | Yes |
Full-text search indexes | Yes | No | Yes[c] | No | No |
Clustered indexes | No | No | Yes | No | No |
Data caches | No | N/A | Yes | No | Yes |
Index caches | Yes | N/A | Yes | No | Yes |
Compressed data | Yes[d] | No | Yes[e] | Yes | No |
Encrypted data[f] | Yes | Yes | Yes | Yes | Yes |
Cluster database support | No | No | No | No | Yes |
Replication support[g] | Yes | Yes | Yes | Yes | Yes |
Foreign key support | No | No | Yes | No | Yes[h] |
Backup / point-in-time recovery[i] | Yes | Yes | Yes | Yes | Yes |
Query cache support | Yes | Yes | Yes | Yes | Yes |
Update statistics for data dictionary | Yes | Yes | Yes | Yes | Yes |
[a] InnoDB support for geospatial indexing is available in MySQL 5.7.5 and later.linux
[b] InnoDB utilizes hash indexes internally for its Adaptive Hash Index feature.git
[c] InnoDB support for FULLTEXT indexes is available in MySQL 5.6.4 and later.github
[d] Compressed MyISAM tables are supported only when using the compressed row format. Tables using the compressed row format with MyISAM are read only.面試
[e] Compressed InnoDB tables require the InnoDB Barracuda file format.sql
[f] Implemented in the server (via encryption functions). Data-at-rest tablespace encryption is available in MySQL 5.7 and later.數據庫
[g] Implemented in the server, rather than in the storage engine.緩存
[h] Support for foreign keys is available in MySQL Cluster NDB 7.3 and later.安全
[i] Implemented in the server, rather than in the storage engine.
MySQL有多種存儲引擎:
MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
MySQL支持數個存儲引擎做爲對不一樣表的類型的處理器。MySQL存儲引擎包括處理事務安全表的引擎和處理非事務安全表的引擎:
◆ MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。MyISAM在全部MySQL配置裏被支持,它是默認的存儲引擎,除非你配置MySQL默認使用另一個引擎。
◆ MEMORY存儲引擎提供「內存中」表。MERGE存儲引擎容許集合將被處理一樣的MyISAM表做爲一個單獨的表。就像MyISAM同樣,MEMORY和MERGE存儲引擎處理非事務表,這兩個引擎也都被默認包含在MySQL中。
註釋:MEMORY存儲引擎正式地被肯定爲HEAP引擎。
◆ InnoDB和BDB存儲引擎提供事務安全表。BDB被包含在爲支持它的操做系統發佈的MySQL-Max二進制分發版裏。InnoDB也默認被包括在所 有MySQL 5.1二進制分發版裏,你能夠按照喜愛經過配置MySQL來容許或禁止任一引擎。
◆ EXAMPLE存儲引擎是一個「存根」引擎,它不作什麼。你能夠用這個引擎建立表,但沒有數據被存儲於其中或從其中檢索。這個引擎的目的是服務,在 MySQL源代碼中的一個例子,它演示說明如何開始編寫新存儲引擎。一樣,它的主要興趣是對開發者。
◆ NDB Cluster是被MySQL Cluster用來實現分割到多臺計算機上的表的存儲引擎。它在MySQL-Max 5.1二進制分發版裏提供。這個存儲引擎當前只被Linux, Solaris, 和Mac OS X 支持。在將來的MySQL分發版中,咱們想要添加其它平臺對這個引擎的支持,包括Windows。
◆ ARCHIVE存儲引擎被用來無索引地,很是小地覆蓋存儲的大量數據。
◆ CSV存儲引擎把數據以逗號分隔的格式存儲在文本文件中。
◆ BLACKHOLE存儲引擎接受但不存儲數據,而且檢索老是返回一個空集。
◆ FEDERATED存儲引擎把數據存在遠程數據庫中。在MySQL 5.1中,它只和MySQL一塊兒工做,使用MySQL C Client API。在將來的分發版中,咱們想要讓它使用其它驅動器或客戶端鏈接方法鏈接到另外的數據源。
當你建立一個新表的時候,你能夠經過添加一個ENGINE 或TYPE 選項到CREATE TABLE語句來告訴MySQL你要建立什麼類型的表:
CREATE TABLE t (i INT) ENGINE = INNODB;
CREATE TABLE t (i INT) TYPE = MEMORY;
雖然TYPE仍然在MySQL 5.1中被支持,如今ENGINE是首選的術語。
如何選擇最適合你的存儲引擎呢?
下述存儲引擎是最經常使用的:
◆ MyISAM:默認的MySQL插件式存儲引擎,它是在Web、數據倉儲和其餘應用環境下最常使用的存儲引擎之一。注意,經過更改STORAGE_ENGINE配置變量,可以方便地更改MySQL服務器的默認存儲引擎。
◆ InnoDB:用於事務處理應用程序,具備衆多特性,包括ACID事務支持。
◆ BDB:可替代InnoDB的事務引擎,支持COMMIT、ROLLBACK和其餘事務特性。
◆ Memory:將全部數據保存在RAM中,在須要快速查找引用和其餘相似數據的環境下,可提供極快的訪問。
◆ Merge:容許MySQL DBA或開發人員將一系列等同的MyISAM表以邏輯方式組合在一塊兒,並做爲1個對象引用它們。對於諸如數據倉儲等VLDB環境十分適合。
◆ Archive:爲大量不多引用的歷史、歸檔、或安全審計信息的存儲和檢索提供了完美的解決方案。
◆ Federated:可以將多個分離的MySQL服務器連接起來,從多個物理服務器建立一個邏輯數據庫。十分適合於分佈式環境或數據集市環境。
◆ Cluster/NDB:MySQL的簇式數據庫引擎,尤爲適合於具備高性能查找要求的應用程序,這類查找需求還要求具備最高的正常工做時間和可用性。
◆ Other:其餘存儲引擎包括CSV(引用由逗號隔開的用做數據庫表的文件),Blackhole(用於臨時禁止對數據庫的應用程序輸入),以及Example引擎(可爲快速建立定製的插件式存儲引擎提供幫助)。
請記住,對於整個服務器或方案,你並不必定要使用相同的存儲引擎,你能夠爲方案中的每一個表使用不一樣的存儲引擎,這點很重要。
mysql> show engines; +------------+---------+----------------------------------------------------------------+ | Engine | Support | Comment | +------------+---------+----------------------------------------------------------------+ | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | | InnoDB | YES | Supports transactions, row-level locking, and foreign keys | | BerkeleyDB | NO | Supports transactions and page-level locking | | BLACKHOLE | NO | /dev/null storage engine (anything you write to it disappears) | | EXAMPLE | NO | Example storage engine | | ARCHIVE | NO | Archive storage engine | | CSV | NO | CSV storage engine | | ndbcluster | NO | Clustered, fault-tolerant, memory-based tables | | FEDERATED | NO | Federated MySQL storage engine | | MRG_MYISAM | YES | Collection of identical MyISAM tables | | ISAM | NO | Obsolete storage engine | +------------+---------+----------------------------------------------------------------+ |
做者: jackbillow
支持多種存儲引擎是衆所周知的MySQL特性,也是MySQL架構的關鍵優點之一。若是可以理解MySQL Server與存儲引擎之間是怎樣經過API交互的,將大大有利於理解MySQL的核心基礎架構。本文將首先介紹MySQL的總體邏輯架構,而後分析MySQL的存儲引擎API並介紹如何編寫本身的MySQL存儲引擎。
MySQL做爲一個大型的網絡程序、數據管理系統,架構很是複雜。下圖大體畫出了其邏輯架構。
MySQL由如下幾部分組成:
MySQL首先是一個網絡程序,其在TCP之上定義了本身的應用層協議。因此要使用MySQL,咱們能夠編寫代碼,跟MySQL Server創建TCP鏈接,以後按照其定義好的協議進行交互。固然這樣比較麻煩,比較方便的辦法是調用SDK,好比Native C API、JDBC、PHP等各語言MySQL Connector,或者經過ODBC。但經過SDK來訪問MySQL,本質上仍是在TCP鏈接上經過MySQL協議跟MySQL進行交互。
每個基於TCP的網絡服務都須要管理客戶端連接,MySQL也不例外。MySQL會爲每個鏈接綁定一個線程,以後這個鏈接上的全部查詢都在這個線程中執行。爲了不頻繁建立和銷燬線程帶來開銷,MySQL一般會緩存線程或者使用線程池,從而避免頻繁的建立和銷燬線程。
客戶端鏈接到MySQL後,在使用MySQL的功能以前,須要進行認證,認證基於用戶名、主機名、密碼。若是用了SSL或者TLS的方式進行鏈接,還會進行證書認證。
MySQL支持DML(數據操做語言)、DDL(數據定義語言)、存儲過程、視圖、觸發器、自定義函數等多種SQL語言接口。
MySQL會解析SQL查詢,併爲其建立語法樹,並根據數據字典豐富查詢語法樹,會驗證該客戶端是否具備執行該查詢的權限。建立好語法樹後,MySQL還會對SQl查詢進行語法上的優化,進行查詢重寫。
語法解析和查詢重寫以後,MySQL會根據語法樹和數據的統計信息對SQL進行優化,包括決定表的讀取順序、選擇合適的索引等,最終生成SQL的具體執行步驟。這些具體的執行步驟裏真正的數據操做都是經過預先定義好的存儲引擎API來進行的,與具體的存儲引擎實現無關。
MySQL內部維持着一些Cache和Buffer,好比Query Cache用來緩存一條Select語句的執行結果,若是可以在其中找到對應的查詢結果,那麼就沒必要再進行查詢解析、優化和執行的整個過程了。
存儲引擎的具體實現,這些存儲引擎都實現了MySQl定義好的存儲引擎API的部分或者所有。MySQL能夠動態安裝或移除存儲引擎,能夠有多種存儲引擎同時存在,能夠爲每一個Table設置不一樣的存儲引擎。存儲引擎負責在文件系統之上,管理表的數據、索引的實際內容,同時也會管理運行時的Cache、Buffer、事務、Log等數據和功能。
MySQL 5.7.11默認支持的存儲引擎以下:
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
全部的數據,數據庫、表的定義,表的每一行的內容,索引,都是存在文件系統上,以文件的方式存在的。固然有些存儲引擎好比InnoDB,也支持不使用文件系統直接管理裸設備,但現代文件系統的實現使得這樣作沒有必要了。
在文件系統之下,可使用本地磁盤,可使用DAS、NAS、SAN等各類存儲系統。
MySQL定義了一系列存儲引擎API,以支持插件式存儲引擎架構。API以Handler類的虛函數的方式存在,可在代碼庫下的./sql/handler.h中查看詳細信息,可在handler類的註釋中看到描述:
/** The handler class is the interface for dynamically loadable storage engines. Do not add ifdefs and take care when adding or changing virtual functions to avoid vtable confusion Functions in this class accept and return table columns data. Two data representation formats are used: 1. TableRecordFormat - Used to pass [partial] table records to/from storage engine 2. KeyTupleFormat - used to pass index search tuples (aka "keys") to storage engine. See opt_range.cc for description of this format. TableRecordFormat ================= [Warning: this description is work in progress and may be incomplete] The table record is stored in a fixed-size buffer: record: null_bytes, column1_data, column2_data, ... //篇幅緣由,略去部份內容。 */ class handler :public Sql_alloc { //篇幅緣由,不列出具體代碼。讀者可直接在源碼文件./sql/handler.h中找到具體內容。 }
下面我將分類描述部分存儲引擎API。
經過函數create來建立一個table:
/** *name:要建立的表的名字 *from:一個TABLE類型的結構,要建立的表的定義,跟MySQL Server已經建立好的tablename.frm文件內容是匹配的 *info:一個HA_CREATE_INFO類型的結構,包含了客戶端輸入的CREATE TABLE語句的信息 */ int create(const char *name, TABLE *form, HA_CREATE_INFO *info);
經過函數open來打開一個table:
/** mode包含如下兩種 O_RDONLY - Open read only O_RDWR - Open read/write */ int open(const char *name, int mode, int test_if_locked);
經過函數close來關閉一個table:
int close(void);
當客戶端調用LOCK TABLE時,經過external_lock函數加鎖:
int ha_example::external_lock(THD *thd, int lock_type)
//初始化全表掃描 virtual int rnd_init (bool scan); //從表中讀取下一行 virtual int rnd_next (byte* buf);
//使用索引前調用該方法 int ha_foo::index_init(uint keynr, bool sorted) //使用索引後調用該方法 int ha_foo::index_end(uint keynr, bool sorted) //讀取索引第一條內容 int ha_index_first(uchar * buf); //讀取索引下一條內容 int ha_index_next(uchar * buf); //讀取索引前一條內容 int ha_index_prev(uchar * buf); //讀取索引最後一條內容 int ha_index_last(uchar * buf); //給定一個key基於索引讀取內容 int index_read(uchar * buf, const uchar * key, uint key_len, enum ha_rkey_function find_flag)
//開始一個事務 int my_handler::start_stmt(THD *thd, thr_lock_type lock_type) //回滾一個事務 int (*rollback)(THD *thd, bool all); //提交一個事務 int (*commit)(THD *thd, bool all);
在MySQL的官方文檔上,有對於編寫本身的存儲引擎的指導文檔,連接以下。
做爲編寫本身存儲引擎的開始,你能夠查看MySQL源碼庫中的一個EXAMPLE存儲引擎,它實現了必需要實現的存儲引擎API,能夠經過複製它們做爲編寫咱們本身存儲引擎的開始:
sed -e s/EXAMPLE/FOO/g -e s/example/foo/g ha_example.h > ha_foo.h sed -e s/EXAMPLE/FOO/g -e s/example/foo/g ha_example.cc > ha_foo.cc
2017-03-18 10:25 by 瀟湘隱者, 1266 閱讀, 1 評論, 收藏, 編輯
本文總結了MySQL下查看、修改存儲引擎的一些方法。測試、驗證環境爲MySQL 5.6 ,若有差別,請以實際版本爲準
1:查看MySQL的存儲引擎信息
1.1 使用show engines命令。
Support列, YES表示當前版本支持這個存儲引擎, DEFAULT表示該引擎是默認的引擎。NO表示不支持該存儲引擎。以下所示,InnoDB是默認的存儲引擎。
1.2 能夠查看系統變量default_storage_engine或storage_engine
1:default_storage_engine 表示永久表(permanent tables)的默認存儲引擎。
2:default_tmp_storage_engine 表示臨時表的默認存儲引擎。
storage_engine這個系統變量不推薦使用,它已經被系統變量default_storage_engine替代了。
mysql> show variables like '%storage_engine%';
+----------------------------+--------+
| Variable_name | Value |
+----------------------------+--------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| storage_engine | InnoDB |
+----------------------------+--------+
3 rows in set (0.01 sec)
mysql>
2:如何修改MySQL的默認存儲引擎?
2.1 修改my.cnf,在配置文件裏面增長參數default-storage-engine,而後重啓數據庫服務。
[mysqld]
default-storage-engine=MyISAM
而後檢查默認存儲引擎,就會看到MyISAM爲默認存儲引擎了。
2.2 使用命令修改系統變量(system variables)
注意,這個系統變量default_storage_engine是BOTH(全局和臨時),並且能夠動態修改。可是要注意,即便你修改了系統變量default_storage_engine,重啓事後就會失效,若是你要永久修改,最好在my.cnf配置文件裏面也設置default-storage-engine的值。
3:如何查看錶使用的存儲引擎?
查看錶所用的存儲引擎,有下面幾種方法:
3.1 查詢information_schema.TABLES
mysql> SELECT TABLE_SCHEMA,
-> TABLE_NAME,
-> TABLE_TYPE,
-> ENGINE
-> FROM information_schema.TABLES
-> WHERE TABLE_NAME = 'TEST';
+--------------+------------+------------+--------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE |
+--------------+------------+------------+--------+
| gsp | TEST | BASE TABLE | InnoDB |
+--------------+------------+------------+--------+
1 row in set (0.00 sec)
mysql>
3.2 使用SHOW CREATE TABLE TEST \G命令。
mysql> SHOW CREATE TABLE TEST \G;
*************************** 1. row ***************************
Table: TEST
Create Table: CREATE TABLE `TEST` (
`ID` int(11) DEFAULT NULL,
`COL1` varchar(6) DEFAULT NULL,
`COL2` varchar(6) DEFAULT NULL,
`COL3` varchar(6) DEFAULT NULL,
`COL4` varchar(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql>
3.3 SHOW TABLE STATUS
mysql> SHOW TABLE STATUS WHERE Name='TEST';
ERROR 1046 (3D000): No database selected
mysql>
mysql>
mysql> use gsp;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SHOW TABLE STATUS WHERE Name='TEST';
如上所示,這種寫法必須制定數據庫,不然,你只能使用下面語法
SHOW TABLE STATUS [{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]
mysql> SHOW TABLE STATUS FROM gsp WHERE Name='TEST';
4:如何修改相關表的存儲引擎?
修改表的存儲引擎很是簡單,語法以下所示
ALTER TABLE my_table ENGINE = InnoDB;
mysql> ALTER TABLE TEST ENGINE=MyISAM;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE TEST \G;
*************************** 1. row ***************************
Table: TEST
Create Table: CREATE TABLE `TEST` (
`ID` int(11) DEFAULT NULL,
`COL1` varchar(6) DEFAULT NULL,
`COL2` varchar(6) DEFAULT NULL,
`COL3` varchar(6) DEFAULT NULL,
`COL4` varchar(6) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql>
5:建立表的時候如何指定存儲引擎。
建立表的時候,若是要指定存儲引擎,只須要設置參數ENGINE便可。很是簡單。
mysql> CREATE TABLE TEST1 (ID INT) ENGINE=InnoDB;
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE TEST2 (ID INT) ENGINE=MyISAM;
Query OK, 0 rows affected (0.00 sec)
參考資料:
https://dev.mysql.com/doc/refman/5.6/en/storage-engine-setting.html
https://dev.mysql.com/doc/refman/5.7/en/storage-engine-setting.html
About Me
.............................................................................................................................................
● 本文整理自網絡
● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客園(http://www.cnblogs.com/lhrbest)和我的微信公衆號(xiaomaimiaolhr)上有同步更新
● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/
● 本文博客園地址:http://www.cnblogs.com/lhrbest
● 本文pdf版、我的簡介及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/
● 數據庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/
● DBA寶典今日頭條號地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826
.............................................................................................................................................
● QQ羣號:230161599(滿)、618766405
● 微信羣:可加我微信,我拉你們進羣,非誠勿擾
● 聯繫我請加QQ好友(646634621),註明添加原因
● 於 2017-08-01 09:00 ~ 2017-08-31 22:00 在魔都完成
● 文章內容來源於小麥苗的學習筆記,部分整理自網絡,如有侵權或不當之處還請諒解
● 版權全部,歡迎分享本文,轉載請保留出處
.............................................................................................................................................
● 小麥苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail
● 小麥苗出版的數據庫類叢書:http://blog.itpub.net/26736162/viewspace-2142121/
.............................................................................................................................................
使用微信客戶端掃描下面的二維碼來關注小麥苗的微信公衆號(xiaomaimiaolhr)及QQ羣(DBA寶典),學習最實用的數據庫技術。
小麥苗的微信公衆號 小麥苗的DBA寶典QQ羣1 小麥苗的DBA寶典QQ羣2 小麥苗的微店
.............................................................................................................................................
![]()
來自 「 ITPUB博客 」 ,連接:http://blog.itpub.net/26736162/viewspace-2143926/,如需轉載,請註明出處,不然將追究法律責任。