你們好,我是jacky,很高興繼續跟你們分享《MySQL數據分析實戰》,今天跟你們分享的主題是表補充之存儲引擎;mysql
咱們以前學了跟表結構相關的一些操做,那咱們看一下建立表的SQL模型:web
在咱們建立表裏,咱們還有ENGINE=存儲引擎,沒有說,咱們如今MySQL的默認引擎是InnoDB,那其實在5.5版本以前,默認的存儲引擎是MyISAM,而5.5以後呢才使用的是InnoDB,本節課程jacky將講解跟存儲引擎有關的一些內容;面試
對於不少零基礎的朋友來講,聽到存儲引擎這個詞,是否是以爲很晦澀,很理論,其實它一點不晦澀,也一點不理論,存儲引擎是整個MySQL的核心,雖然做爲核心,但不少資料沒有把存儲引擎講透,由於面對初學的朋友來講,能用上MySQL存儲引擎的,不過就是一條SQL語句;好比說:ENGINE=InnoDB,而且這是在建立庫或者是建立表的時候才能用上它,如何你不寫它,系統也會默認給你一個生成,對於一些作數據分析或是產品經理等朋友來講,須要的數據我能從數據庫裏查詢調用就行,沒有必要把原理搞的這麼清楚,因此纔會有些朋友,使用了幾年的MySQL,如今仍是搞不清存儲引擎是什麼,因此有些人工資和能力老是停滯不前也是這個緣由,業務須要精進,對於我的的職業發展是必要的條件,當你抱怨你的現實跟理想差距怎麼這麼大的時候,咱們有沒有想過,咱們的才華跟咱們的夢想是否是相匹配,咱們是否是要提高咱們的才華和能力,那當咱們遇到提高能力的瓶頸時應該如何突破了,就是對咱們的技能要知其然,更要之因此然;算法
jacky說了這麼多,就是告訴你們,存儲引擎很重要,SQL語句很簡單,可是這句SQL語句背後的意義,咱們更要重視和理解,好,開篇說完,咱們正式開始講存儲引擎,第一部分,仍是跟以往的分享同樣,給你們梳理一下本課時的邏輯線;sql
jacky再給你們總結一下,本課時的邏輯線就是,記一下筆記:數據庫
1.存儲引擎是什麼,MySQL的發明者把它發明出來的背景是什麼;緩存
2.存儲引擎的應用場景是什麼,它能幫助咱們解決企業中的什麼實際問題;安全
3.咱們怎樣用MySQL這個存儲引擎;架構
這個學習邏輯線,特別的清晰,就是是什麼,爲何,怎麼樣,這些都清楚了,存儲引發也就清楚了;併發
開過汽車或瞭解汽車的朋友都知道,手動擋汽車裏有一個離合器的東西,你們也都知道只有左腳踩上離合器,汽車才能掛上擋,加油後汽車才能啓動;可是,問你們爲何踩上離合器汽車才能啓動,大部分人是回答不上來的,同理,一些朋友對於MySQL中的存儲引擎也是這樣的,存儲引擎是什麼,都有一些模糊的理解,關於存儲引擎是怎樣在MySQL中起做用的大部分人也是說不清的;
好,那接下來就是,咱們爲何必定要掌握存儲引擎的原理,你們思考,汽車的離合器壞了,有修車長和4S店給你修,你的存儲引擎在MySQL配置中出了錯,你找誰去修,讓別的同事去修,這大可能是行不一樣的,因此,咱們要知道存儲引擎到底在MySQL中是如何起做用的?
咱們該怎麼學才能搞清楚存儲引擎呢?仍是借用離合器那個類比,咱們要搞懂離合器在汽車中是如何起做用的,是否是要先搞懂汽車的結構,進而才能知道離合器在整個汽車結構中處於什麼樣的做用;
同理道理,要搞清楚存儲引擎,咱們也要先搞懂MySQL的架構體系,或者說是MySQL的物理組件,咱們才能深入的理解存儲引擎,好,這個邏輯咱們捋順了,咱們就按照這個邏輯來學習吧
先來看下,MySQL的構架體系圖:
這張圖能夠告訴咱們MySQL具體是怎麼執行的,咱們看下MySQL是由哪幾部分組成的,從結構表裏看有SQL接口、解析器、優化器、緩存、存儲引擎,等等這麼多,是否是,下面jacky分別來講一些每部分分別是什麼:
Connectors:不一樣語言中與SQL的交互接口;
Management Serivices & Utillities:系統管理和控制工具
Connection Pool:鏈接池
SQL Interface:接收用戶的SQL指令,而且返回須要查詢的結果
Parser:解析器
Optimizer:查詢優化器
咱們的SQL語句在查詢以前,就會使用到這個查詢優化器,來對咱們的查詢進行優化,查詢優化器使用的策略是(簡單瞭解下):
1)選取 ➡️2)投影➡️3)鏈接
Caches & Buffers:查詢緩存
Engine:存儲引擎
File system /File & Logs:文件和日誌的存儲,這個就沒什麼說的了 ;
接着上次的分享,jacky跟你們說了存儲引擎的第一個邏輯線,存儲引擎是什麼?對於MYSQL的構架體系,jacky在此次分享的開頭再作一下補充說明,就是jacky講這個MySQL的構架體系,是爲了讓你們理解存儲引擎在MySQL中的做用,是這個目的,對於其餘的MYSQL構架你們有個印象,瞭解就好,沒必要過於糾結,固然知道的越多,對存儲引擎的理解就越深,固然,單單只是瞭解,也不耽誤咱們接下來的學習;
好,咱們迴歸主題, 按照咱們的邏輯線,咱們講完第一部分存儲引擎是什麼,
接下來我應該講存儲引擎的應用場景是吧,講它是怎樣幫助咱們解決問題的,最後講咱們應該怎樣用存儲引擎,也就是在MySQL應該怎樣建立這個存儲引擎,是吧,按照這個邏輯講是否是就會很清楚了;咱們先記下筆記,把這個邏輯框架先記下來:
筆記:(二)存儲引擎的應用場景
筆記:(三)存儲引擎怎樣用;
好,關於第二部分,涉及的內容比較多,jacky先講第三個邏輯線就是存儲引擎怎麼用,換句話說,就是在MySQL裏,咱們建立表的時候,應該如何建立咱們的存儲引擎;
CREATE TABLE 表名( 字段名1 數據類型 [屬性] 索引, 字段名1 數據類型 [屬性] 索引, … … )ENGINE=存儲引擎 CHARSET=字符集;
咱們知道存儲引擎怎麼用了,ENGINE=要替換的存儲引擎,咱們還用知道爲何要這樣用,咱們何時用ENGINE=InnoDB,何時用ENGINE=MyISAM,都是咱們這部分要探討的問題;
咱們要想知道各類不用類型存儲引擎的應用場景,首先要知道MySQL中有多少種類型的存儲引擎是吧,咱們打開MySQL軟件看一下:
SHOW ENGINES\G
show engines以後,jacky給你們講解下相關的選項信息
ENGINE:存儲引擎名稱
SUPPORT:是否支持此存儲引擎
COMMENT:存儲引擎的註釋
TRANSACTIONS:是否支持事務
XA:是否支持分佈式交易處理的XA規範
SAVEPOINTS:是否支持保存點,以便事務回滾到保存點
好,這時初學的朋友會說,哎,jacky你說的太理論了,什麼是事務,什麼是XA規範,什麼又是事務回滾呢?
你們這裏只要先理解一個概念就行了,就是什麼是事務,關於其餘的一些理論名詞,咱們聽過就行,先不用管它,可是事務必定要明白什麼意思,在面試和實際工做中這個詞都是十分重要的;
上面是這些選項的一個意義,能夠經過show engines查看全部存儲引擎,當咱們建庫的時候,或者建表的時候,當咱們沒有指定存儲引擎,咱們使用的就是默認的存儲引擎,在MySQL的版本在5.5以前默認的都是MyISAM,而5.5以後呢才使用的是InnoDB;咱們能夠經過下面這個SQL語句查看當前的默認存儲引擎,語句是:
SHOW VARIABLES LIKE 'storage_engine';
咱們學習每一個存儲引擎,都要學習這些存儲引擎的特色,正是由於咱們知道了這些存儲引擎的特色,才能選擇合適的存儲引擎;由於存儲引擎對於咱們數據的存儲包括索引,起着關鍵性的做用;
(1)默認MyISAM 的表會在存盤中產生3個文件:
.frm:表結構文件
.MYD:數據文件
.MYI:索引文件
(2)能夠在建表的時候指定數據文件和索引文件的存儲位置,只有MyISAM表支持,其餘的存儲引擎若是寫上也是沒有效果的:
DATA DIRECORY [=] 數據保存的絕對路徑
INDEX DIRECORY [=] 索引文件保存的絕對路徑
(3)MyISAM單表最大支持的數據量:2的64次方條記錄,每一個表最多能夠創建64個索引
並非說MyISAM支持的少,有不少No就說明它不行,MyISAM在5.5以前做爲MySQL默認的存儲引擎已經有10年了,包括如今咱們系統中的表的存儲引擎仍是MyISAM,只不過它不是默認的存儲引擎了,咱們看一下
show databases;
use information_schema;
show tables;
show create table views;
優勢
缺點
(1)鎖粒度太粗
(2)不支持事務
(1)定長(靜態)FIXED
(2)動態 DYNAMIC
(3)壓縮 COMPRESSED
定長和動態不須要咱們特殊指定,它會在咱們建立表的時候,根據咱們的字段類型,自動的去適配,假如咱們都是CHAR類型的,它就是咱們的靜態表,若是說有VARCHAR,TEXT,當咱們建立表時,就是動態表;
像咱們壓縮的存儲格式,咱們必須經過一個工具myisampack來建立,這個後面jacky講工具時會說,這裏就再也不提了;
在5.5以後,InnoDB是咱們默認的存儲引擎,也能夠說是最重要的,也是最經常使用的存儲引擎;InnoDB是業界公認的高性能,高可用性並且是使用頻率最普遍的存儲引擎,已經具備不可撼動的地位,相比於其餘的存儲引擎,它具備哪些特性呢?
特性一:設計遵循ACID模型,支持事務,具備從服務崩潰中恢復的能力,可以最大限度的包括咱們用戶的數據
ACID模型其實就是咱們事務的四個特性:
原子性(Atomiocity)
一致性(Consistency)
隔離性(Isolation)
持久性(Durability)
特性二:支持行級鎖,能夠提高多用戶併發時的讀寫性能;
特性三:支持外鍵,保存了數據的一致性和完整性;
特性四:InnoDB擁有本身獨立的緩衝池,經常使用的數據和索引都在緩存中;
特性五:對於INSERT、UPDATE、DELETE操做,InnoDB會使用一種change buffering機制來自動優化,還能夠提供一致性的讀,而且還可以緩存變動的數據,減小磁盤I/O,提升性能
建立InnoDB表後會產生兩個文件
.frm 表結構文件
.ibd 數據和索引存儲表空間中
全部的表都須要建立主鍵,最好配合自增的屬性,也能夠放到常常查詢的列,做爲主鍵
咱們能夠根據應用的須要,選擇如何存儲,MySQL默認支持多種存儲引擎,以適用不一樣領域的數據庫的須要,咱們能夠經過選擇適用不用的存儲引擎,提升應用的效率,提供靈活的存儲,以達到最大程度可指定性,