本節(jié)重點
- 了解存儲引擎
本節(jié)時長需控制在10分鐘內(nèi)
一 什么是存儲引擎
mysql中建立的庫===>文件夾
庫中建立的表===>文件
現(xiàn)實生活中我們用來存儲數(shù)據(jù)的文件有不同的類型,每種文件類型對應各自不同的處理機制:比如處理文本用txt類型,處理表格用excel,處理圖片用png等
數(shù)據(jù)庫中的表也應該有不同的類型,表的類型不同,會對應mysql不同的存取機制,表類型又稱為存儲引擎。
存儲引擎說白了就是如何存儲數(shù)據(jù)、如何為存儲的數(shù)據(jù)建立索引和如何更新、查詢數(shù)據(jù)等技術(shù)的實現(xiàn)方
法。因為在關(guān)系數(shù)據(jù)庫中數(shù)據(jù)的存儲是以表的形式存儲的,所以存儲引擎也可以稱為表類型(即存儲和
操作此表的類型)
在Oracle 和SQL Server等數(shù)據(jù)庫中只有一種存儲引擎,所有數(shù)據(jù)存儲管理機制都是一樣的。而MySql
數(shù)據(jù)庫提供了多種存儲引擎。用戶可以根據(jù)不同的需求為數(shù)據(jù)表選擇不同的存儲引擎,用戶也可以根據(jù)
自己的需要編寫自己的存儲引擎

SQL 解析器、SQL 優(yōu)化器、緩沖池、存儲引擎等組件在每個數(shù)據(jù)庫中都存在,但不是每 個數(shù)據(jù)庫都有這么多存儲引擎。MySQL 的插件式存儲引擎可以讓存儲引擎層的開發(fā)人員設(shè) 計他們希望的存儲層,例如,有的應用需要滿足事務(wù)的要求,有的應用則不需要對事務(wù)有這 么強的要求 ;有的希望數(shù)據(jù)能持久存儲,有的只希望放在內(nèi)存中,臨時并快速地提供對數(shù)據(jù) 的查詢。
二 mysql支持的存儲引擎
MariaDB [(none)]> show engines\G #查看所有支持的存儲引擎
MariaDB [(none)]> show variables like 'storage_engine%'; #查看正在使用的存儲引擎
1、InnoDB 存儲引擎
支持事務(wù),其設(shè)計目標主要面向聯(lián)機事務(wù)處理(OLTP)的應用。其
特點是行鎖設(shè)計、支持外鍵,并支持類似 Oracle 的非鎖定讀,即默認讀取操作不會產(chǎn)生鎖。 從 MySQL 5.5.8 版本開始是默認的存儲引擎。
InnoDB 存儲引擎將數(shù)據(jù)放在一個邏輯的表空間中,這個表空間就像黑盒一樣由 InnoDB 存儲引擎自身來管理。從 MySQL 4.1(包括 4.1)版本開始,可以將每個 InnoDB 存儲引擎的 表單獨存放到一個獨立的 ibd 文件中。此外,InnoDB 存儲引擎支持將裸設(shè)備(row disk)用 于建立其表空間。
InnoDB 通過使用多版本并發(fā)控制(MVCC)來獲得高并發(fā)性,并且實現(xiàn)了 SQL 標準 的 4 種隔離級別,默認為 REPEATABLE 級別,同時使用一種稱為 netx-key locking 的策略來 避免幻讀(phantom)現(xiàn)象的產(chǎn)生。除此之外,InnoDB 存儲引擎還提供了插入緩沖(insert buffer)、二次寫(double write)、自適應哈希索引(adaptive hash index)、預讀(read ahead) 等高性能和高可用的功能。
對于表中數(shù)據(jù)的存儲,InnoDB 存儲引擎采用了聚集(clustered)的方式,每張表都是按 主鍵的順序進行存儲的,如果沒有顯式地在表定義時指定主鍵,InnoDB 存儲引擎會為每一 行生成一個 6 字節(jié)的 ROWID,并以此作為主鍵。
InnoDB 存儲引擎是 MySQL 數(shù)據(jù)庫最為常用的一種引擎,Facebook、Google、Yahoo 等 公司的成功應用已經(jīng)證明了 InnoDB 存儲引擎具備高可用性、高性能以及高可擴展性。對其 底層實現(xiàn)的掌握和理解也需要時間和技術(shù)的積累。如果想深入了解 InnoDB 存儲引擎的工作 原理、實現(xiàn)和應用,可以參考《MySQL 技術(shù)內(nèi)幕:InnoDB 存儲引擎》一書。
2、MyISAM 存儲引擎
不支持事務(wù)、表鎖設(shè)計、支持全文索引,主要面向一些 OLAP 數(shù) 據(jù)庫應用,在 MySQL 5.5.8 版本之前是默認的存儲引擎(除 Windows 版本外)。數(shù)據(jù)庫系統(tǒng) 與文件系統(tǒng)一個很大的不同在于對事務(wù)的支持,MyISAM 存儲引擎是不支持事務(wù)的。究其根 本,這也并不難理解。用戶在所有的應用中是否都需要事務(wù)呢?在數(shù)據(jù)倉庫中,如果沒有 ETL 這些操作,只是簡單地通過報表查詢還需要事務(wù)的支持嗎?此外,MyISAM 存儲引擎的 另一個與眾不同的地方是,它的緩沖池只緩存(cache)索引文件,而不緩存數(shù)據(jù)文件,這與 大多數(shù)的數(shù)據(jù)庫都不相同。
3、NDB 存儲引擎
年,MySQL AB 公司從 Sony Ericsson 公司收購了 NDB 存儲引擎。 NDB 存儲引擎是一個集群存儲引擎,類似于 Oracle 的 RAC 集群,不過與 Oracle RAC 的 share everything 結(jié)構(gòu)不同的是,其結(jié)構(gòu)是 share nothing 的集群架構(gòu),因此能提供更高級別的 高可用性。NDB 存儲引擎的特點是數(shù)據(jù)全部放在內(nèi)存中(從 5.1 版本開始,可以將非索引數(shù) 據(jù)放在磁盤上),因此主鍵查找(primary key lookups)的速度極快,并且能夠在線添加 NDB 數(shù)據(jù)存儲節(jié)點(data node)以便線性地提高數(shù)據(jù)庫性能。由此可見,NDB 存儲引擎是高可用、 高性能、高可擴展性的數(shù)據(jù)庫集群系統(tǒng),其面向的也是 OLTP 的數(shù)據(jù)庫應用類型。
4、Memory 存儲引擎
正如其名,Memory 存儲引擎中的數(shù)據(jù)都存放在內(nèi)存中,數(shù)據(jù)庫重 啟或發(fā)生崩潰,表中的數(shù)據(jù)都將消失。它非常適合于存儲 OLTP 數(shù)據(jù)庫應用中臨時數(shù)據(jù)的臨時表,也可以作為 OLAP 數(shù)據(jù)庫應用中數(shù)據(jù)倉庫的維度表。Memory 存儲引擎默認使用哈希 索引,而不是通常熟悉的 B+ 樹索引。
5、Infobright 存儲引擎
第三方的存儲引擎。其特點是存儲是按照列而非行的,因此非常 適合 OLAP 的數(shù)據(jù)庫應用。其官方網(wǎng)站是 http://www.infobright.org/,上面有不少成功的數(shù)據(jù) 倉庫案例可供分析。
6、NTSE 存儲引擎
網(wǎng)易公司開發(fā)的面向其內(nèi)部使用的存儲引擎。目前的版本不支持事務(wù), 但提供壓縮、行級緩存等特性,不久的將來會實現(xiàn)面向內(nèi)存的事務(wù)支持。
7、BLACKHOLE
黑洞存儲引擎,可以應用于主備復制中的分發(fā)主庫。
MySQL 數(shù)據(jù)庫還有很多其他存儲引擎,上述只是列舉了最為常用的一些引擎。如果 你喜歡,完全可以編寫專屬于自己的引擎,這就是開源賦予我們的能力,也是開源的魅 力所在。
三 使用存儲引擎
方法1:建表時指定
MariaDB [db1]> create table innodb_t1(id int,name char)engine=innodb;
MariaDB [db1]> create table innodb_t2(id int)engine=innodb;
MariaDB [db1]> show create table innodb_t1;
MariaDB [db1]> show create table innodb_t2;
方法2:在配置文件中指定默認的存儲引擎
/etc/my.cnf
[mysqld]
default-storage-engine=INNODB
innodb_file_per_table=1
查看
[root@egon db1]# cd /var/lib/mysql/db1/
[root@egon db1]# ls
db.opt innodb_t1.frm innodb_t1.ibd innodb_t2.frm innodb_t2.ibd
練習
創(chuàng)建四個表,分別使用innodb,myisam,memory,blackhole存儲引擎,進行插入數(shù)據(jù)測試
MariaDB [db1]> create table t1(id int)engine=innodb;
MariaDB [db1]> create table t2(id int)engine=myisam;
MariaDB [db1]> create table t3(id int)engine=memory;
MariaDB [db1]> create table t4(id int)engine=blackhole;
MariaDB [db1]> quit
[root@egon db1]# ls /var/lib/mysql/db1/ #發(fā)現(xiàn)后兩種存儲引擎只有表結(jié)構(gòu),無數(shù)據(jù)
db.opt t1.frm t1.ibd t2.MYD t2.MYI t2.frm t3.frm t4.frm
#memory,在重啟mysql或者重啟機器后,表內(nèi)數(shù)據(jù)清空
#blackhole,往表內(nèi)插入任何數(shù)據(jù),都相當于丟入黑洞,表內(nèi)永遠不存記錄