表操作——存儲引擎介紹
一、什麼是存儲引擎
mysql中建立的庫===>文件夾
庫中建立的表===>文件
現實生活中我們用來存儲數據的文件有不同的類型,每種文件類型對應各自不同的處理機制:比如處理文本用txt類型,處理表格用excel,處理圖片用png等。
數據庫中的表也應該有不同的類型,表的類型不同,會對應mysql不同的存取機制,表類型又稱爲存儲引擎。
存儲引擎說白了就是如何存儲數據、如何爲存儲的數據建立索引和如何更新、查詢數據等技術的實現方
法。因爲在關係數據庫中數據的存儲是以表的形式存儲的,所以存儲引擎也可以稱爲表類型(即存儲和
操作此表的類型)
在Oracle 和SQL Server等數據庫中只有一種存儲引擎,所有數據存儲管理機制都是一樣的。而MySql
數據庫提供了多種存儲引擎。用戶可以根據不同的需求爲數據表選擇不同的存儲引擎,用戶也可以根據
自己的需要編寫自己的存儲引擎。
SQL 解析器、SQL 優化器、緩衝池、存儲引擎等組件在每個數據庫中都存在,但不是每個數據庫都有這麼多存儲引擎。MySQL的插件式存儲引擎可以讓存儲引擎層的開發人員設計他們希望的存儲層,例如,有的應用需要滿足事務的要求;有的應用則不需要對事務有這麼強的要求;有的希望數據能持久存儲,有的只希望放在內存中,臨時並快速地提供對數據的查詢。
二、mysql支持的存儲引擎
MariaDB [(none)]> show engines\G #查看所有支持的存儲引擎
MariaDB [(none)]> show variables like 'storage_engine%'; #查看正在使用的存儲引擎
1、InnoDB存儲引擎
支持事務,其設計目標主要面向聯機事務處理(OLTP)的應用。其特點是行鎖設計、支持外鍵,並支持類似 Oracle 的非鎖定讀,即默認讀取操作不會產生鎖。 從 MySQL 5.5.8 版本開始是默認的存儲引擎。
InnoDB 存儲引擎將數據放在一個邏輯的表空間中,這個表空間就像黑盒一樣由 InnoDB 存儲引擎自身來管理。從 MySQL 4.1(包括 4.1)版本開始,可以將每個 InnoDB 存儲引擎的表單獨存放到一個獨立的 ibd 文件中。此外,InnoDB 存儲引擎支持將裸設備(row disk)用於建立其表空間。
InnoDB 通過使用多版本併發控制(MVCC)來獲得高併發性,並且實現了 SQL 標準的4種隔離級別,默認爲 REPEATABLE 級別,同時使用一種稱爲 netx-key locking 的策略來避免幻讀(phantom)現象的產生。除此之外,InnoDB 存儲引擎還提供了插入緩衝(insert buffer)、二次寫(double write)、自適應哈希索引(adaptive hash index)、預讀(read ahead) 等高性能和高可用的功能。
對於表中數據的存儲,InnoDB 存儲引擎採用了聚集(clustered)的方式,每張表都是按主鍵的順序進行存儲的,如果沒有顯式地在表定義時指定主鍵,InnoDB 存儲引擎會爲每一行生成一個 6 字節的 ROWID,並以此作爲主鍵。
InnoDB 存儲引擎是 MySQL 數據庫最爲常用的一種引擎,Facebook、Google、Yahoo 等 公司的成功應用已經證明了 InnoDB 存儲引擎具備高可用性、高性能以及高可擴展性。對其底層實現的掌握和理解也需要時間和技術的積累。如果想深入瞭解 InnoDB 存儲引擎的工作原理、實現和應用,可以參考《MySQL 技術內幕:InnoDB 存儲引擎》一書。
2、MyISAM存儲引擎
不支持事務、表鎖設計、支持全文索引,主要面向一些 OLAP 數據庫應用,在 MySQL 5.5.8 版本之前是默認的存儲引擎(除 Windows 版本外)。數據庫系統與文件系統一個很大的不同在於對事務的支持,MyISAM 存儲引擎是不支持事務的。究其根本,這也並不難理解。用戶在所有的應用中是否都需要事務呢?在數據倉庫中,如果沒有 ETL 這些操作,只是簡單地通過報表查詢還需要事務的支持嗎?此外,MyISAM 存儲引擎的另一個與衆不同的地方是,它的緩衝池只緩存(cache)索引文件,而不緩存數據文件,這與大多數的數據庫都不相同。
3、NDB存儲引擎
MySQL AB 公司從 Sony Ericsson 公司收購了 NDB 存儲引擎。 NDB 存儲引擎是一個集羣存儲引擎,類似於 Oracle 的 RAC 集羣,不過與 Oracle RAC 的 share everything 結構不同的是,其結構是 share nothing 的集羣架構,因此能提供更高級別的高可用性。NDB 存儲引擎的特點是數據全部放在內存中(從 5.1 版本開始,可以將非索引數 據放在磁盤上),因此主鍵查找(primary key lookups)的速度極快,並且能夠在線添加 NDB 數據存儲節點(data node)以便線性地提高數據庫性能。由此可見,NDB 存儲引擎是高可用、 高性能、高可擴展性的數據庫集羣系統,其面向的也是 OLTP 的數據庫應用類型。
4、Memory存儲引擎
正如其名,Memory 存儲引擎中的數據都存放在內存中,數據庫重啓或發生崩潰,表中的數據都將消失。它非常適合於存儲 OLTP 數據庫應用中臨時數據的臨時表,也可以作爲 OLAP 數據庫應用中數據倉庫的維度表。Memory 存儲引擎默認使用哈希索引,而不是通常熟悉的 B+ 樹索引。
5、Infobright存儲引擎
第三方的存儲引擎。其特點是存儲是按照列而非行的,因此非常 適合 OLAP 的數據庫應用。其官方網站是http://www.infobright.org/ ,上面有不少成功的數據倉庫案例可供分析。
6、NTSE存儲引擎
網易公司開發的面向其內部使用的存儲引擎。目前的版本不支持事務,但提供壓縮、行級緩存等特性,不久的將來會實現面向內存的事務支持。
7、BLACKHOLE
黑洞存儲引擎,可以應用於主備複製中的分發主庫。
MySQL 數據庫還有很多其他存儲引擎,上述只是列舉了最爲常用的一些引擎。如果你喜歡,完全可以編寫專屬於自己的引擎,這就是開源賦予我們的能力,也是開源的魅力所在。
三、使用存儲引擎
方法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
練習
創建四個表,分別使用innodb,myisam,memory,blackhole存儲引擎,進行插入數據測試。
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/ #發現後兩種存儲引擎只有表結構,無數據
db.opt t1.frm t1.ibd t2.MYD t2.MYI t2.frm t3.frm t4.frm
#memory,在重啓mysql或者重啓機器後,表內數據清空
#blackhole,往表內插入任何數據,都相當於丟入黑洞,表內永遠不存記錄