數據庫存儲引擎

mysql存儲引擎概述

存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方
法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和操做此表的類型)mysql

SQL 解析器、SQL 優化器、緩衝池、存儲引擎等組件在每一個數據庫中都存在,但不是每 個數據庫都有這麼多存儲引擎。MySQL 的插件式存儲引擎可讓存儲引擎層的開發人員設 計他們但願的存儲層,例如,有的應用須要知足事務的要求,有的應用則不須要對事務有這 麼強的要求 ;有的但願數據能持久存儲,有的只但願放在內存中,臨時並快速地提供對數據 的查詢。 sql

一種類型代表的是一種存儲方式
存儲引擎:就是表的類型,不一樣的類型就會對應不一樣的處理機制去處理他
事務:就是要麼同時成功,要麼同時不成功數據庫

mysql支持哪些存儲引擎?

mysql5.6支持的存儲引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。緩存

其中NDB和InnoDB提供事務安全表,其餘存儲引擎都是非事務安全表。安全

各類存儲引擎的特性

InnoDB服務器

MySql 5.6 版本默認的存儲引擎。InnoDB 是一個事務安全的存儲引擎,它具有提交、回滾以及崩潰恢復的功能以保護用戶數據。InnoDB 的行級別鎖定以及 Oracle 風格的一致性無鎖讀提高了它的多用戶併發數以及性能。InnoDB 將用戶數據存儲在彙集索引中以減小基於主鍵的普通查詢所帶來的 I/O 開銷。爲了保證數據的完整性,InnoDB 還支持外鍵約束。網絡

MyISAM架構

MyISAM既不支持事務、也不支持外鍵、其優點是訪問速度快,可是表級別的鎖定限制了它在讀寫負載方面的性能,所以它常常應用於只讀或者以讀爲主的數據場景。併發

Memory函數

在內存中存儲全部數據,應用於對非關鍵數據由快速查找的場景。Memory類型的表訪問數據很是快,由於它的數據是存放在內存中的,而且默認使用HASH索引,可是一旦服務關閉,表中的數據就會丟失

BLACKHOLE

黑洞存儲引擎,相似於 Unix 的 /dev/null,Archive 只接收但卻並不保存數據。對這種引擎的表的查詢經常返回一個空集。這種表能夠應用於 DML 語句須要發送到從服務器,但主服務器並不會保留這種數據的備份的主從配置中。

事務

        簡單地說,事務就是指邏輯上的一組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)
            一個事務一旦被提交,它對數據庫中的數據改變就是永久性的。若是出了錯誤,事務也不允撤銷,只能經過'補償性事務'。

經常使用存儲引擎及適用場景

InnoDB

用於事務處理應用程序,支持外鍵和行級鎖。若是應用對事物的完整性有比較高的要求,在併發條件下要求數據的一致性,數據操做除了插入和查詢以外,還包括不少更新和刪除操做,那麼InnoDB存儲引擎是比較合適的。InnoDB除了有效的下降由刪除和更新致使的鎖定,還能夠確保事務的完整提交和回滾,對於相似計費系統或者財務系統等對數據準確要求性比較高的系統都是合適的選擇。

MyISAM

若是應用是以讀操做和插入操做爲主,只有不多的更新和刪除操做,而且對事務的完整性、併發性要求不高,那麼能夠選擇這個存儲引擎。

Memory

將全部的數據保存在內存中,在須要快速定位記錄和其餘相似數據的環境下,能夠提供極快的訪問。Memory的缺陷是對錶的大小有限制,雖然數據庫由於異常終止的話數據能夠正常恢復,可是一旦數據庫關閉,存儲在內存中的數據都會丟失。

存儲引擎在mysql中的使用

查看當前的默認存儲引擎:

mysql> show variables like "default_storage_engine";

查詢當前數據庫支持的存儲引擎

mysql> show engines \G;

指定存儲引擎建表

在建表時指定

mysql> create table ai(id bigint(12),name varchar(200)) ENGINE=MyISAM;

mysql> create table country(id int(4),cname varchar(50)) ENGINE=InnoDB;

也可使用alter table語句,修改一個已經存在的表的存儲引擎。

mysql> alter table ai engine = innodb;

在配置文件中指定

#my.ini文件

[mysqld]

default-storage-engine=INNODB

不一樣引擎在建立表的時候生成文件的不一樣

建立四個表,分別使用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人家設定的規則就是這樣存儲表的,使用人家的系統,就要理解人家的規則。

mysql的工做流程

MySQL架構總共四層,在上圖中以虛線做爲劃分。 
  首先,最上層的服務並非MySQL獨有的,大多數給予網絡的客戶端/服務器的工具或者服務都有相似的架構。好比:鏈接處理、受權認證、安全等。 
  第二層的架構包括大多數的MySQL的核心服務。包括:查詢解析、分析、優化、緩存以及全部的內置函數(例如:日期、時間、數學和加密函數)。同時,全部的跨存儲引擎的功能都在這一層實現:存儲過程、觸發器、視圖等。

  第三層包含了存儲引擎。存儲引擎負責MySQL中數據的存儲和提取。服務器經過API和存儲引擎進行通訊。這些接口屏蔽了不一樣存儲引擎之間的差別,使得這些差別對上層的查詢過程透明化。存儲引擎API包含十幾個底層函數,用於執行「開始一個事務」等操做。但存儲引擎通常不會去解析SQL(InnoDB會解析外鍵定義,由於其自己沒有實現該功能),不一樣存儲引擎之間也不會相互通訊,而只是簡單的響應上層的服務器請求。

  第四層包含了文件系統,全部的表結構和數據以及用戶操做的日誌最終仍是以文件的形式存儲在硬盤上。

相關文章
相關標籤/搜索