MySQL數據分析-(15)表補充:存儲引擎

你們好,我是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

邏輯線

  • 什麼是存儲引擎,爲何咱們要學習存儲引擎,它應用的背景是什麼, 爲何MySQL和大多數數據庫不一樣,MySQL有一個存儲引擎概念,而大多數其餘的數據庫沒有存儲引擎這個概念,學了數據庫咱們能解決什麼現實問題;

jacky再給你們總結一下,本課時的邏輯線就是,記一下筆記:數據庫

  • 1.存儲引擎是什麼,MySQL的發明者把它發明出來的背景是什麼;緩存

  • 2.存儲引擎的應用場景是什麼,它能幫助咱們解決企業中的什麼實際問題;安全

  • 3.咱們怎樣用MySQL這個存儲引擎;架構

這個學習邏輯線,特別的清晰,就是是什麼,爲何,怎麼樣,這些都清楚了,存儲引發也就清楚了;併發

(一)存儲引擎是個什麼東東?

1.1 存儲引擎初識

  • 先拋開存儲引擎是什麼不說, jacky以前分享了這麼多MySQL內容,你們學到這裏,有沒有體會到MySQL究竟是啥,是幹什麼的?說白了,MySQL就是一個用來存儲數據的軟件,是否是,就這麼簡單,它就是用來存儲數據的;
    • 你們記下筆記:MySQL的核心是存儲引擎;沒有存儲引擎,MySQL是存儲不了數據的,這就是存儲引擎,因此說它很重要;

1.2 如何深刻淺出的理解存儲引擎

開過汽車或瞭解汽車的朋友都知道,手動擋汽車裏有一個離合器的東西,你們也都知道只有左腳踩上離合器,汽車才能掛上擋,加油後汽車才能啓動;可是,問你們爲何踩上離合器汽車才能啓動,大部分人是回答不上來的,同理,一些朋友對於MySQL中的存儲引擎也是這樣的,存儲引擎是什麼,都有一些模糊的理解,關於存儲引擎是怎樣在MySQL中起做用的大部分人也是說不清的;
好,那接下來就是,咱們爲何必定要掌握存儲引擎的原理,你們思考,汽車的離合器壞了,有修車長和4S店給你修,你的存儲引擎在MySQL配置中出了錯,你找誰去修,讓別的同事去修,這大可能是行不一樣的,因此,咱們要知道存儲引擎到底在MySQL中是如何起做用的?

  • 咱們該怎麼學才能搞清楚存儲引擎呢?仍是借用離合器那個類比,咱們要搞懂離合器在汽車中是如何起做用的,是否是要先搞懂汽車的結構,進而才能知道離合器在整個汽車結構中處於什麼樣的做用;

  • 同理道理,要搞清楚存儲引擎,咱們也要先搞懂MySQL的架構體系,或者說是MySQL的物理組件,咱們才能深入的理解存儲引擎,好,這個邏輯咱們捋順了,咱們就按照這個邏輯來學習吧

1.3 MySQL構架體系(物理組件)

先來看下,MySQL的構架體系圖:

@數據分析-jacky

這張圖能夠告訴咱們MySQL具體是怎麼執行的,咱們看下MySQL是由哪幾部分組成的,從結構表裏看有SQL接口、解析器、優化器、緩存、存儲引擎,等等這麼多,是否是,下面jacky分別來講一些每部分分別是什麼:

  • Connectors:不一樣語言中與SQL的交互接口;

  • Management Serivices & Utillities:系統管理和控制工具

  • Connection Pool:鏈接池

    • 管理緩衝用戶的鏈接,包括線程處理須要緩衝的需求,就經過鏈接池來實現;
  • SQL Interface:接收用戶的SQL指令,而且返回須要查詢的結果

    • 好比咱們寫了SELECT * FROM 表名,就能夠獲得結果,包括咱們寫一個建立表的語句,都是寫的SQL語句,經過SQL Interface來接收指令,而且返回結果
  • Parser:解析器

    • 其實咱們的SQL指令傳到解析器的時候,先會被解析驗證和進行解析,先驗證一下咱們寫的SQL語句是否對,接着再來解析,其實它解析的時候也不是整個SQL語句進行解析,它是把一個大的 SQL語句拆分紅咱們這樣一塊一塊的來解析,若是在分析過程當中遇到錯誤,那麼就說明這個SQL語句有問題,那就會返回一個錯誤,是這樣的一個效果;
  • Optimizer:查詢優化器

    • 咱們的SQL語句在查詢以前,就會使用到這個查詢優化器,來對咱們的查詢進行優化,查詢優化器使用的策略是(簡單瞭解下):

      • 1)選取 ➡️2)投影➡️3)鏈接

        • 舉一個簡單的例子:SELECT name FROM user WHERE age>18;MySQL的查詢機制是這樣的,MySQL先根據條件篩選出一部分記錄, 而不是把因此條件都篩選出來,再篩選出age>18的記錄,不是這樣的;那接着,篩選出來記錄以後,要查name字段,只拿name字段的值,而不是把因此字段都拿出來以後,再取name字段的值;最後把這兩個結果結合在一塊兒返回給你,是這樣的一個查詢機制和過程;這就是咱們說的查詢優化器;
  • Caches & Buffers:查詢緩存

    • 查詢緩存什麼意思,若是說咱們查詢緩存中有命中的一個查詢結果,它就不會去後面查了,直接使用緩存中去讀取數據;若是緩存中沒有,它在去後面去查,是這樣的一個過程;
  • Engine:存儲引擎

    • 接着就是咱們的Engine了,這就是爲何咱們先要介紹MySQL的物理組件,再來介紹存儲引擎,MySQL中的存儲引擎也是MySQL中比較大的特點,咱們看到這個圖中有不少小插銷,那它表明的意義是什麼呢?就是表明咱們的存儲引擎是能夠插拔的,那這裏面咱們用到誰就能夠插誰,那咱們看到,這裏面有這麼多存儲引擎,咱們使用誰,咱們就能夠加上誰,接着在後面咱們看到還有一個加號,加號的意思是什麼呢?加號的意思是咱們的存儲引擎是能夠拓展的,固然了,若是你有能力,你能夠本身來寫一個存儲引擎,像咱們的BAT,它們能夠根據本身的業務本身定製一個存儲引擎,
  • File system /File & Logs:文件和日誌的存儲,這個就沒什麼說的了 ;

@數據分析-jacky


接着上次的分享,jacky跟你們說了存儲引擎的第一個邏輯線,存儲引擎是什麼?對於MYSQL的構架體系,jacky在此次分享的開頭再作一下補充說明,就是jacky講這個MySQL的構架體系,是爲了讓你們理解存儲引擎在MySQL中的做用,是這個目的,對於其餘的MYSQL構架你們有個印象,瞭解就好,沒必要過於糾結,固然知道的越多,對存儲引擎的理解就越深,固然,單單只是瞭解,也不耽誤咱們接下來的學習;

好,咱們迴歸主題, 按照咱們的邏輯線,咱們講完第一部分存儲引擎是什麼,
接下來我應該講存儲引擎的應用場景是吧,講它是怎樣幫助咱們解決問題的,最後講咱們應該怎樣用存儲引擎,也就是在MySQL應該怎樣建立這個存儲引擎,是吧,按照這個邏輯講是否是就會很清楚了;

咱們先記下筆記,把這個邏輯框架先記下來:
筆記:(二)存儲引擎的應用場景
筆記:(三)存儲引擎怎樣用;

(二)存儲引擎怎麼用

好,關於第二部分,涉及的內容比較多,jacky先講第三個邏輯線就是存儲引擎怎麼用,換句話說,就是在MySQL裏,咱們建立表的時候,應該如何建立咱們的存儲引擎;

3.1 存儲引擎建立的sql語句

  • 你們有沒有思考過,咱們第四章的總目錄叫SQL基礎操做之表操做,咱們看下咱們都講了什麼?
    數據分析-jacky
CREATE TABLE 表名( 字段名1 數據類型 [屬性] 索引, 字段名1 數據類型 [屬性] 索引, … … )ENGINE=存儲引擎 CHARSET=字符集;
  • 你們有沒有看到關於表補充,jacky講的都是上面這個建立表的SQL模型,那本節課程,說白了咱們就是講了一個SQL語句,就是ENGINE=存儲引擎,當工做時,咱們實際代碼操做就這麼多,下面的分享,jacky會說,這條存儲語句SQL語句能夠替換爲InnoDB,也能夠替換成MyISAM,或是其餘的存儲引擎,是吧,存儲引擎真的很簡單;

(三)存儲引擎的應用場景

咱們知道存儲引擎怎麼用了,ENGINE=要替換的存儲引擎,咱們還用知道爲何要這樣用,咱們何時用ENGINE=InnoDB,何時用ENGINE=MyISAM,都是咱們這部分要探討的問題;

3.1 存儲引擎彙總

咱們要想知道各類不用類型存儲引擎的應用場景,首先要知道MySQL中有多少種類型的存儲引擎是吧,咱們打開MySQL軟件看一下:

SHOW ENGINES\G

show engines以後,jacky給你們講解下相關的選項信息

  • ENGINE:存儲引擎名稱

  • SUPPORT:是否支持此存儲引擎

  • COMMENT:存儲引擎的註釋

  • TRANSACTIONS:是否支持事務

  • XA:是否支持分佈式交易處理的XA規範

  • SAVEPOINTS:是否支持保存點,以便事務回滾到保存點

好,這時初學的朋友會說,哎,jacky你說的太理論了,什麼是事務,什麼是XA規範,什麼又是事務回滾呢?
你們這裏只要先理解一個概念就行了,就是什麼是事務,關於其餘的一些理論名詞,咱們聽過就行,先不用管它,可是事務必定要明白什麼意思,在面試和實際工做中這個詞都是十分重要的;

3.2 什麼是事務

上面是這些選項的一個意義,能夠經過show engines查看全部存儲引擎,當咱們建庫的時候,或者建表的時候,當咱們沒有指定存儲引擎,咱們使用的就是默認的存儲引擎,在MySQL的版本在5.5以前默認的都是MyISAM,而5.5以後呢才使用的是InnoDB;咱們能夠經過下面這個SQL語句查看當前的默認存儲引擎,語句是:

SHOW VARIABLES LIKE 'storage_engine';
  • 咱們能夠看到默認的存儲引擎是InnoDB,固然咱們在建表,建庫的時候也能夠指定不一樣的存儲引擎,那接下咱們就看一下各類存儲引擎之間有什麼不一樣特性,包括適用在哪些業務場景下,那接下來,jacky就帶着你們一一來看這些存儲引擎,看看這些存儲引擎的特色以及不一樣的應用場景;

3.1 MyISAM存儲引擎

3.1.1 MyISAM的演變

  • MySQL5.5 以前一直默認的存儲引擎都是MyISAM,MyISAM的前身是ISAM,實際上那時尚未存儲引擎的概念,ISAM只是一種算法,或者說是數據的處理方式,隨着MySQL的發展,MySQL的架構是不斷的發展和演進,最終才引進了咱們開始在物理組件圖中,看到的這種架構的形式,那咱們的存儲引擎也是可插拔式的,是很顛覆的一個形式,那ISAM也進化到了咱們的MyISAM,而且也是做爲MySQL默認的存儲引擎,直到5.5以後,InnoDB才取代了MyISAM,那可能有朋友會說這個InnoDB必定很牛啊,可是呢你不瞭解MyISAM,你也不知道,也InnoDB相比,各自的優點和劣勢是什麼,如今也不是說MyISAM用不到了,一樣有不少場景須要用到MyISAM存儲引擎;

3.1.2 測試MyISAM存儲引擎

咱們學習每一個存儲引擎,都要學習這些存儲引擎的特色,正是由於咱們知道了這些存儲引擎的特色,才能選擇合適的存儲引擎;由於存儲引擎對於咱們數據的存儲包括索引,起着關鍵性的做用;

  • (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;

@數據分析-jacky

  • 咱們看到,咱們安裝完MySQL數據庫後,系統自帶的幾個庫,包括mysql,information_schema,這幾個庫使用的存儲引擎都是MyISAM,因此說MyISAM仍是有它的用處的,它仍是很強大的,不過它的缺點也很明顯,下面咱們來總結下MyISAM的優勢缺點有什麼;

3.1.3 MyISAM的優勢與缺點

  • 優勢

    • 對於查詢和寫入場景來講,MyISAM查詢快,寫入也快
  • 缺點

    • (1)鎖粒度太粗

      • 是表級鎖,不是行級鎖,對於咱們實時應用的場景,它的響應速度不是很理想;
    • (2)不支持事務

      • 像咱們銀行,金融類的場景是用不了MyISAM存儲引擎的;

3.1.4 MyISAM支持的三種存儲格式

  • (1)定長(靜態)FIXED

    • 靜態格式是最簡單,也是最安全的格式,若是說咱們出現數據崩潰了,它也是最快恢復的,一樣的查找數據也是最快的,它很容易在咱們的磁盤中定位和查找咱們的記錄;
  • (2)動態 DYNAMIC

    • 動態表處理數據要複雜一些,它在每行會有一個行頭來標識咱們這行的長度,可是咱們這個長度又是不固定的,,因此咱們每次寫入都會從新來標定,若是說咱們要常常更新咱們的表,它一樣的會產生一些碎片,咱們須要使用響應的工具來消除咱們的碎片,它的好長是佔用的空間小,就像前面jacky分享的char和varchar的區別,var是以空間換時間,而varchar是以時間換空間
  • (3)壓縮 COMPRESSED

定長和動態不須要咱們特殊指定,它會在咱們建立表的時候,根據咱們的字段類型,自動的去適配,假如咱們都是CHAR類型的,它就是咱們的靜態表,若是說有VARCHAR,TEXT,當咱們建立表時,就是動態表;
像咱們壓縮的存儲格式,咱們必須經過一個工具myisampack來建立,這個後面jacky講工具時會說,這裏就再也不提了;

3.2 InnoDB存儲引擎

在5.5以後,InnoDB是咱們默認的存儲引擎,也能夠說是最重要的,也是最經常使用的存儲引擎;InnoDB是業界公認的高性能,高可用性並且是使用頻率最普遍的存儲引擎,已經具備不可撼動的地位,相比於其餘的存儲引擎,它具備哪些特性呢?

3.2.1 特性

  • 特性一:設計遵循ACID模型,支持事務,具備從服務崩潰中恢復的能力,可以最大限度的包括咱們用戶的數據

    • ACID模型其實就是咱們事務的四個特性:

      • 原子性(Atomiocity)

      • 一致性(Consistency)

      • 隔離性(Isolation)

      • 持久性(Durability)

  • 特性二:支持行級鎖,能夠提高多用戶併發時的讀寫性能;

  • 特性三:支持外鍵,保存了數據的一致性和完整性;

  • 特性四:InnoDB擁有本身獨立的緩衝池,經常使用的數據和索引都在緩存中;

  • 特性五:對於INSERT、UPDATE、DELETE操做,InnoDB會使用一種change buffering機制來自動優化,還能夠提供一致性的讀,而且還可以緩存變動的數據,減小磁盤I/O,提升性能

3.2.2 測試InnoDB存儲引擎

  • 建立InnoDB表後會產生兩個文件

    • .frm 表結構文件

    • .ibd 數據和索引存儲表空間中

      • 之後咱們也能夠單獨的指定數據保存在哪兒,包括索引保存在哪兒,這裏先不說,不說跟它相關的一些配置,由於這些配置選項太多了,之後你們要是學習優化了,那時在去學習

3.2.3 一些經驗

  • 全部的表都須要建立主鍵,最好配合自增的屬性,也能夠放到常常查詢的列,做爲主鍵

  • 咱們能夠根據應用的須要,選擇如何存儲,MySQL默認支持多種存儲引擎,以適用不一樣領域的數據庫的須要,咱們能夠經過選擇適用不用的存儲引擎,提升應用的效率,提供靈活的存儲,以達到最大程度可指定性,

相關文章
相關標籤/搜索