首先肯定一點,存儲引擎的概念是MySQL裏面纔有的,不是全部的關係型數據庫都有存儲引擎這個概念,後面咱們還會說,可是如今要肯定這一點。 css
在講清楚什麼是存儲引擎以前,咱們先來個比喻,咱們都知道錄製一個視頻文件,能夠轉換成不一樣的格式,例如mp4,avi,wmv等,而存在咱們電腦的磁盤上也會存在於不一樣類型的文件系統中如windows裏常見的ntfs、fat32,存在於linux裏常見的ext3,ext4,xfs,可是,給咱們或者用戶看懂實際視頻內容都是同樣的。直觀區別是,佔用系統的空間大小與清晰程度可能不同。
那麼數據庫表裏的數據存儲在數據庫裏及磁盤上和上述的視頻格式及存儲磁盤文件的系統格式特徵相似,也有不少種存儲方式。
可是對於用戶和應用程序來講一樣一張表的數據,不管用什麼引擎來存儲,用戶可以看到的數據是同樣的。不一樣儲引擎存取,引擎功能,佔用空間大小,讀取性能等可能有區別。說白了,存儲引擎就是在如何存儲數據、提取數據、更新數據等技術方法的實現上,底層的實現方式不一樣,那麼就會呈現出不一樣存儲引擎有着一些本身獨有的特色和功能,對應着不一樣的存取機制。
由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即:對錶的存儲、操做等的實現方法不一樣),表是什麼,表本質上就是磁盤上的文件。node
其實MySQL支持多種存儲引擎,每種引擎有着一些本身獨特的功能,用戶在使用的時候,能夠根據本身的業務場景來使用不一樣的存儲引擎,其中MySQL最經常使用的存儲引擎爲:MyISAM和InnoDB。 在詳細介紹這些存儲引擎以前,咱們先來看看MySQL的整個工做流程,看一下存儲引擎在哪裏,MySQL都作了哪些事情。 看下圖:這是我在MySQL官方手冊上拿下來的(手冊你若是可以玩好,未來你就能作一個NB的DBA~~~)
英文版的看着很難受啊超哥,好好好,給你來個中文的,看下圖:mysql
來,看每一個部分的解釋,看下圖:linux
搞明白整個過程以後,咱們來細說一下這些存儲引擎,看下一節~~~sql
前面咱們對MySQL進行操做的時候並無指定存儲引擎,爲何還能用呢,沒有指定還能用,說明什麼,說明MySQL默認有一個存儲引擎,我記得MySQL5.5以前,默認的存儲引擎是MyISAM,以後都改成InnoDB了,咱們的重點就是這個InnoDB,也是公司中最經常使用的、最好用的引擎,可是仍是一些公司在用MyISAM引擎,除了歷史緣由以外,還有MyISAM的效率比InnoDB高一點,InnoDB在這方面作了不少優化,效率已經和MyISAM差很少了,可是InnoDB引擎還有好多其餘的NB的功能,下面咱們就介紹幾種存儲引擎。數據庫
首先看一下我們的默認存儲引擎:vim
不一樣的引擎表明着不一樣的存取機制,那麼有哪些引擎呢,鏈接進入mysql以後,查看MySQL支持的全部存儲引擎:windows
一、show engines;#查看MySQL全部的引擎,緩存
二、show variables like "storage_engine%";查看當前正在使用的引擎安全
注意:在存儲大文件的時候,能夠存到數據庫,可是儘可能別直接存到數據庫裏面,會影響數據庫的效率,咱們就存文件的路徑、地址,用戶想要這個大文件,咱們能夠到對應的路徑下取讀取這個文件給用戶。
幾種經常使用引擎介紹
1. MyISAM引擎
MyISAM引擎特色: 1.不支持事務 事務是指邏輯上的一組操做,組成這組操做的各個單元,要麼全成功要麼全失敗。 2.表級鎖定 數據更新時鎖定整個表:其鎖定機制是表級鎖定,也就是對錶中的一個數據進行操做都會將這個表鎖定,其餘人不能操做這個表,這雖然可讓鎖定的實現成本很小可是也同時大大下降了其併發性能。 3.讀寫互相阻塞 不只會在寫入的時候阻塞讀取,MyISAM還會再讀取的時候阻塞寫入,但讀自己並不會阻塞另外的讀。 4.只會緩存索引 MyISAM能夠經過key_buffer_size的值來提升緩存索引,以大大提升訪問性能減小磁盤IO,可是這個緩存區只會緩存索引,而不會緩存數據。 5.讀取速度較快 佔用資源相對較少 6.不支持外鍵約束,但只是全文索引 7.MyISAM引擎是MySQL5.5版本以前的默認引擎,是對最初的ISAM引擎優化的產物。
MyISAM引擎適用的生產業務場景 1.不須要事務支持的業務(例如轉帳就不行,充值也不行) 2.通常爲讀數據比較多的應用,讀寫都頻繁場景不適合,讀多或者寫多的都適合。 3.讀寫併發訪問都相對較低的業務(純讀純寫高併發也能夠)(鎖定機制問題) 4.數據修改相對較少的業務(阻塞問題) 5.以讀爲主的業務,例如:www.blog,圖片信息數據庫,用戶數據庫,商品庫等業務 6.對數據一致性要求不是很高的業務。 7.中小型的網站部分業務會用。 小結:單一對數據庫的操做均可以示用MyISAM,所謂單一就是儘可能純讀,或純寫(insert,update,delete)等。
MyISAM引擎調優精要 1.設置合適的索引(緩存機制)(where、join後面的列創建索引,重複值比較少的建索引等) 2.調整讀寫優先級,根據實際需求確保重要操做更優先執行,讀寫的時候能夠經過參數設置優先級。 3.啓用延遲插入改善大批量寫入性能(下降寫入頻率,儘量多條數據一次性寫入)。 4.儘可能順序操做讓insert數據都寫入到尾部,較少阻塞。 5.分解大的操做,下降單個操做的阻塞時間,就像操做系統控制cpu分片同樣。 6.下降併發數(減小對MySQL訪問),某些高併發場景經過應用進行排隊隊列機制Q隊列。 7.對於相對靜態(更改不頻繁)的數據庫數據,充分利用Query Cache(能夠經過配置文件配置)或memcached緩存服務能夠極大的提升訪問頻率。 8.MyISAM的Count只有在全表掃描的時候特別高效,帶有其餘條件的count都須要進行實際的數據訪問。 9.能夠把主從同步的主庫使用innodb,從庫使用MyISAM引擎。主庫寫,從庫讀能夠(不推薦,有些麻煩的地方,市場上有人這麼用)。
不支持事務、表鎖設計、支持全文索引,主要面向一些 OLAP 數 據庫應用,在 MySQL 5.5.8 版本以前是默認的存儲引擎(除 Windows 版本外)。數據庫系統 與文件系統一個很大的不一樣在於對事務的支持,MyISAM 存儲引擎是不支持事務的。究其根 本,這也並不難理解。用戶在全部的應用中是否都須要事務呢?在數據倉庫中,若是沒有 ETL 這些操做,只是簡單地經過報表查詢還須要事務的支持嗎?此外,MyISAM 存儲引擎的 另外一個不同凡響的地方是,它的緩衝池只緩存(cache)索引文件,而不緩存數據文件,這與 大多數的數據庫都不相同。
2. InnoDB引擎
InnoDB引擎 介紹:InnoDB引擎是MySQL數據庫的另外一個重要的存儲引擎,正稱爲目前MySQL AB所發行新版的標準,被包含在全部二進制安裝包裏。和其餘的存儲引擎相比,InnoDB引擎的優勢是支持兼容ACID的事務(相似於PostGreSQL),以及參數完整性(即對外鍵的支持)。Oracle公司與2005年10月收購了Innobase。Innobase採用雙認證受權。它使用GNU發行,也容許其餘想將InnoDB結合到商業軟件的團體得到受權。 InnoDB引擎特色: 1.支持事務:支持4個事務隔離界別,支持多版本讀。 2.行級鎖定(更新時通常是鎖定當前行):經過索引實現,全表掃描仍然會是表鎖,注意間隙鎖的影響。 3.讀寫阻塞與事務隔離級別相關(有多個級別,這就不介紹啦~)。 4.具體很是高效的緩存特性:能緩存索引,也能緩存數據。 5.整個表和主鍵與Cluster方式存儲,組成一顆平衡樹。(瞭解) 6.全部SecondaryIndex都會保存主鍵信息。(瞭解) 7.支持分區,表空間,相似oracle數據庫。 8.支持外鍵約束,不支持全文索引(5.5以前),之後的都支持了。 9.和MyISAM引擎比較,InnoDB對硬件資源要求仍是比較高的。 小結:三個重要功能:Supports transactions,row-level locking,and foreign keys
InnoDB引擎適用的生產業務場景 1.須要事務支持(具備較好的事務特性,例銀行業務) 2.行級鎖定對高併發有很好的適應能力,但須要確保查詢是經過索引完成。 3.數據更新較爲頻繁的場景,如:BBS(論壇)、SNS(社交平臺)、微博等 4.數據一致性要求較高的業務,例如:充值轉帳,銀行卡轉帳。 5.硬件設備內存較大,能夠利用InnoDB較好的緩存能力來提升內存利用率,儘量減小磁盤IO,能夠經過一些參數來設置,這個就不細講啦~~~ 6.相比MyISAM引擎,Innodb引擎更消耗資源,速度沒有MyISAM引擎快
InnoDB引擎調優精要 1.主鍵儘量小,避免給Secondery index帶來過大的空間負擔。 2.避免全表掃描,由於會使用表鎖。 3.儘量緩存全部的索引和數據,提升響應速度,較少磁盤IO消耗。 4.在大批量小插入的時候,儘可能本身控制事務而不要使用autocommit自動提交,有開關能夠控制提交方式。 5合理設置innodb_flush_log_at_trx_commit參數值,不要過分追求安全性。 若是innodb_flush_log_at_trx_commit的值爲0,log buffer每秒就會被刷寫日誌文件到磁盤,提交事務的時候不作任何操做。 6.避免主鍵更新,由於這會帶來大量的數據移動。 能夠看一看InnoDB的重要參數學習一下。
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 存儲引擎》一書。
總說事務,到底啥事事務?咱們看看解釋:
事務介紹: 簡單地說,事務就是指邏輯上的一組SQL語句操做,組成這組操做的各個SQL語句,執行時要麼全成功要麼全失敗。 例如:你給我轉帳5塊錢,流程以下 a.從你銀行卡取出5塊錢,剩餘計算money-5 b.把上面5塊錢打入個人帳戶上,我收到5塊,剩餘計算money+5. 上述轉帳的過程,對應的sql語句爲: update 你_account set money=money-5 where name='你'; update 我_account set money=money+5 where name='我'; 上述的兩條SQL操做,在事務中的操做就是要麼都執行,要麼都不執行,否則錢就對不上了。 這就是事務的原子性(Atomicity)。 事務的四大特性: 1.原子性(Atomicity) 事務是一個不可分割的單位,事務中的全部SQL等操做要麼都發生,要麼都不發生。 2.一致性(Consistency) 事務發生前和發生後,數據的完整性必須保持一致。 3.隔離性(Isolation) 當併發訪問數據庫時,一個正在執行的事務在執行完畢前,對於其餘的會話是不可見的,多個併發事務之間的數據是相互隔離的。也就是其餘人的操做在這個事務的執行過程當中是看不到這個事務的執行結果的,也就是他們拿到的是這個事務執行以前的內容,等這個事務執行完才能拿到新的數據。 4.持久性(Durability) 一個事務一旦被提交,它對數據庫中的數據改變就是永久性的。若是出了錯誤,事務也不允撤銷,只能經過'補償性事務'。 事務的開啓: 數據庫默認事務是自動提交的,也就是發一條sql他就執行一條。若是想多條sql放在一個事務中執行,則須要使用事務進行處理。當咱們開啓一個事務,而且沒有提交,mysql會自動回滾事務。或者咱們使用rollback命令手動回滾事務。 數據庫開啓事務的命令,咱們後面會講到~~~
在介紹上面兩個引擎中涉及的兩個概念(OLTP和OLAP)的介紹
參考文章:https://blog.csdn.net/zhangzheng0413/article/details/8271322/
**3.其餘引擎的介紹
#NDB 存儲引擎 2003 年,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 的數據庫應用類型。 #Memory 存儲引擎 正如其名,Memory 存儲引擎中的數據都存放在內存中,數據庫重 啓或發生崩潰,表中的數據都將消失。它很是適合於存儲 OLTP 數據庫應用中臨時數據的臨時表,也能夠做爲 OLAP 數據庫應用中數據倉庫的維度表。Memory 存儲引擎默認使用哈希 索引,而不是一般熟悉的 B+ 樹索引。 #Infobright 存儲引擎 第三方的存儲引擎。其特色是存儲是按照列而非行的,所以很是 適合 OLAP 的數據庫應用。其官方網站是 http://www.infobright.org/,上面有很多成功的數據 倉庫案例可供分析。 #NTSE 存儲引擎 網易公司開發的面向其內部使用的存儲引擎。目前的版本不支持事務, 但提供壓縮、行級緩存等特性,不久的未來會實現面向內存的事務支持。 #BLACKHOLE 黑洞存儲引擎,能夠應用於主備複製中的分發主庫。 MySQL 數據庫還有不少其餘存儲引擎,上述只是列舉了最爲經常使用的一些引擎。若是 你喜歡,徹底能夠編寫專屬於本身的引擎,這就是開源賦予咱們的能力,也是開源的魅 力所在。
一、建立表時指定引擎
create table innodb_t2(id int)engine=innodb;
二、在配置文件中指定默認的存儲引擎
linux:vim /etc/my.cnf windows:my.ini文件 [mysqld] default-storage-engine=INNODB #配置默認引擎,如今用的mysql默認基本都是InnoDB,因此其實均可以不用配置了 innodb_file_per_table=1 #表示獨立表空間存儲,能夠不寫
三、不一樣引擎在建立表的時候生成文件的不一樣
建立四個表,分別使用innodb,myisam,memory,blackhole存儲引擎,進行插入數據測試
#下面是使用四個不一樣的引擎來建立的表create table t1(id int)engine=innodb; create table t2(id int)engine=myisam; create table t3(id int)engine=memory; create table t4(id int)engine=blackhole;
經過四種引擎來建立的表,咱們對照着其生成的文件來看一下區別,看下圖:
關於上面的文件做用介紹:
1.db.opt文件:用來記錄該庫的默認字符集編碼和字符集排序規則用的。也就是說若是你建立數據庫指定默認字符集和排序規則,那麼後續建立的表若是沒有指定字符集和排序規則,那麼該新建的表將採用db.opt文件中指定的屬性。 2.後綴名爲.frm的文件:這個文件主要是用來描述數據表結構(id,name字段等)和字段長度等信息 3.後綴名爲.ibd的文件:這個文件主要儲存的是採用獨立表儲存模式時儲存數據庫的數據信息和索引信息; 4.後綴名爲.MYD(MYData)的文件:從名字能夠看出,這個是存儲數據庫數據信息的文件,主要是存儲採用獨立表儲存模式時存儲的數據信息; 5.後綴名爲.MYI的文件:這個文件主要儲存的是數據庫的索引信息; 6.ibdata1文件:主要做用也是儲存數據信息和索引信息,這個文件在mysql安裝目錄的data文件夾下。 從上面能夠看出,.ibd儲存的是數據信息和索引信息,ibdata1文件也是存儲數據信息和索引信息,.MYD和.MYI也是分別儲存數據信息和索引信息,那他們之間有什麼區別呢? 主要區別是再於數據庫的存儲引擎不同,若是儲存引擎採用的是MyISAM,則生成的數據文件爲表名.frm、表名.MYD、表名的MYI;而儲存引擎若是是innoDB,開啓了innodb_file_per_table=1,也就是採用獨立儲存的模式,生成的文件是表名.frm、表名.ibd,若是採用共存儲模式的,數據信息和索引信息都存儲在ibdata1(在裏面進行分類,從外面看是一個文件)中; 在進行數據恢復的時候,若是用的是MYISAM數據引擎,那麼數據很好恢復,只要將相應.frm, .MYD, .MYI文件拷貝過去便可。可是若是是innodb的話,則每個數據表都是一個單獨的文件,只將相應的.frm和.ibd文件拷貝過去是不夠的,必須在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才能夠。 msyql人家設定的規則就是這樣存儲表的,使用人家的系統,就要理解人家的規則。
在Oracle 和SQL Server等全部數據存儲管理機制都是同樣的。而MySql數據庫提供了多種存儲引擎。用戶能夠根據不一樣的需求爲數據表選擇不一樣的存儲引擎,用戶也能夠根據本身的須要編寫本身的存儲引擎。
Oracle中不存在引擎的概念,數據處理大體能夠分紅兩大類:聯機事務處理OLTP(on-line transaction processing)、聯機分析處理OLAP(On-Line Analytical Processing)。OLTP是傳統的關係型數據庫的主要應用,主要是基本的、平常的事務處理,例如銀行交易。OLAP是數據倉庫系統的主要應用,支持複雜的分析操做,側重決策支持,而且提供直觀易懂的查詢結果。
關於MySQL的存儲引擎大概就說這麼多吧有興趣或者有基礎的同窗,能夠多去學一下MySQL官方手冊..收穫會有不少那麼咱們就繼續回到咱們的數據表操做去學習吧