溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Mysql數(shù)據(jù)庫的存儲(chǔ)引擎有哪些

發(fā)布時(shí)間:2020-06-10 15:39:23 來源:億速云 閱讀:206 作者:元一 欄目:編程語言

存儲(chǔ)引擎概念

MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲(chǔ)在文件(或者內(nèi)存)中。這些技術(shù)中的每一種技術(shù)都使用不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能和能力。通過選擇不同的技術(shù),你能夠獲得額外的速度或者功能,從而改善你的應(yīng)用的整體功能。

存儲(chǔ)引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。

InnoDB(B+樹)

InnoDB 底層存儲(chǔ)結(jié)構(gòu)為B+樹, B樹的每個(gè)節(jié)點(diǎn)對應(yīng)innodb的一個(gè)page,page大小是固定的,一般設(shè)為 16k。其中非葉子節(jié)點(diǎn)只有鍵值,葉子節(jié)點(diǎn)包含完成數(shù)據(jù)。

數(shù)據(jù)庫:存儲(chǔ)引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等
適用場景

1)經(jīng)常更新的表,適合處理多重并發(fā)的更新請求。

2)支持事務(wù)。

3)可以從災(zāi)難中恢復(fù)(通過 bin-log 日志等)。

4)外鍵約束。只有他支持外鍵。

5)支持自動(dòng)增加列屬性 auto_increment。

TokuDB(Fractal Tree-節(jié)點(diǎn)帶數(shù)據(jù))

TokuDB 底層存儲(chǔ)結(jié)構(gòu)為 Fractal Tree,Fractal Tree 的結(jié)構(gòu)與 B+樹有些類似, 在 Fractal Tree中,每一個(gè) child 指針除了需要指向一個(gè) child 節(jié)點(diǎn)外,還會(huì)帶有一個(gè) Message Buffer ,這個(gè)Message Buffer 是一個(gè) FIFO 的隊(duì)列,用來緩存更新操作。
例如,一次插入操作只需要落在某節(jié)點(diǎn)的 Message Buffer 就可以馬上返回了,并不需要搜索到葉子節(jié)點(diǎn)。這些緩存的更新會(huì)在查詢時(shí)或后臺(tái)異步合并應(yīng)用到對應(yīng)的節(jié)點(diǎn)中。

數(shù)據(jù)庫:存儲(chǔ)引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等
TokuDB 在線添加索引,不影響讀寫操作, 非常快的寫入性能, Fractal-tree 在事務(wù)實(shí)現(xiàn)上有優(yōu)勢。 他主要適用于訪問頻率不高的數(shù)據(jù)或歷史數(shù)據(jù)歸檔。

MyIASM

MyIASM是 MySQL默認(rèn)的引擎,但是它沒有提供對數(shù)據(jù)庫事務(wù)的支持,也不支持行級鎖和外鍵,因此當(dāng) INSERT(插入)或 UPDATE(更新)數(shù)據(jù)時(shí)即寫操作需要鎖定整個(gè)表,效率便會(huì)低一些。

ISAM 執(zhí)行讀取操作的速度很快,而且不占用大量的內(nèi)存和存儲(chǔ)資源。在設(shè)計(jì)之初就預(yù)想數(shù)據(jù)組織成有固定長度的記錄,按順序存儲(chǔ)的。

---ISAM 是一種靜態(tài)索引結(jié)構(gòu),缺點(diǎn)是它不 支持事務(wù)處理。

Memory

Memory(也叫 HEAP)堆內(nèi)存:使用存在內(nèi)存中的內(nèi)容來創(chuàng)建表。每個(gè) MEMORY 表只實(shí)際對應(yīng)一個(gè)磁盤文件。MEMORY 類型的表訪問非常得快,因?yàn)樗臄?shù)據(jù)是放在內(nèi)存中的,并且默認(rèn)使用HASH 索引。但是一旦服務(wù)關(guān)閉,表中的數(shù)據(jù)就會(huì)丟失掉。 Memory 同時(shí)支持散列索引和 B 樹索引,B樹索引可以使用部分查詢和通配查詢,也可以使用<,>和>=等操作符方便數(shù)據(jù)挖掘,散列索引相等的比較快但是對于范圍的比較慢很多。

索引
索引(Index)是幫助 MySQL 高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。常見的查詢算法,順序查找,二分查找,二叉排序樹查找,哈希散列法,分塊查找,平衡多路搜索樹 B 樹(B-tree)

常見索引原則

1.選擇唯一性索引

唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。

2.為經(jīng)常需要排序、分組和聯(lián)合操作的字段建立索引:

3.為常作為查詢條件的字段建立索引。

4.限制索引的數(shù)目:

越多的索引,會(huì)使更新表變得很浪費(fèi)時(shí)間。

5.盡量使用數(shù)據(jù)量少的索引

如果索引的值很長,那么查詢的速度會(huì)受到影響。

6.盡量使用前綴來索引

如果索引字段的值很長,最好使用值的前綴來索引。

7.刪除不再使用或者很少使用的索引

8 . 最左前綴匹配原則,非常重要的原則。

9 . 盡量選擇區(qū)分度高的列作為索引

10.區(qū)分度的公式是表示字段不重復(fù)的比例

11 .索引列不能參與計(jì)算,保持列“干凈”:帶函數(shù)的查詢不參與索引。

12 .盡量的擴(kuò)展索引,不要新建索引。

數(shù)據(jù)庫三范式

范式是具有最小冗余的表結(jié)構(gòu)。范式具體如下:

第一范式(1st NF -列都是不可再分)

第一范式的目標(biāo)是確保每列的原子性:如果每列都是不可再分的最小數(shù)據(jù)單元(也稱為最小的原子單元),則滿足第一范式(1NF)
數(shù)據(jù)庫:存儲(chǔ)引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等

第二范式(2nd NF-每個(gè)表只描述一件事情)

首先滿足第一范式,并且表中非主鍵列不存在對主鍵的部分依賴。 第二范式要求每個(gè)表只描述一件事情。

數(shù)據(jù)庫:存儲(chǔ)引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等
第三范式(3rd NF- 不存在對非主鍵列的傳遞依賴)

第三范式定義是,滿足第二范式,并且表中的列不存在對非主鍵列的傳遞依賴。除了主鍵訂單編號外,顧客姓名依賴于非主鍵顧客編號。

數(shù)據(jù)庫:存儲(chǔ)引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等
數(shù)據(jù)庫是事務(wù)

事務(wù)(TRANSACTION)是作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,這些操作作為一個(gè)整體一起向系統(tǒng)提交,要么都執(zhí)行、要么都不執(zhí)行 。事務(wù)是一個(gè)不可分割的工作邏輯單元

事務(wù)必須具備以下四個(gè)屬性,簡稱 ACID 屬性:

原子性(Atomicity)

  1. 事務(wù)是一個(gè)完整的操作。事務(wù)的各步操作是不可分的(原子的);要么都執(zhí)行,要么都不執(zhí)行。

一致性(Consistency)

  1. 當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致狀態(tài)。隔離性(Isolation)

  2. 對數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,這表明事務(wù)必須是獨(dú)立的,它不應(yīng)以任何方式依賴于或影響其他事務(wù)。

永久性(Durability)

  1. 事務(wù)完成后,它對數(shù)據(jù)庫的修改被永久保持,事務(wù)日志能夠保持事務(wù)的永久性。

存儲(chǔ)過程(特定功能的 SQL 語句集)

一組為了完成特定功能的 SQL 語句集,存儲(chǔ)在數(shù)據(jù)庫中,經(jīng)過第一次編譯后再次調(diào)用不需要再次編譯,用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來執(zhí)行它。存儲(chǔ)過程是數(shù)據(jù)庫中的一個(gè)重要對象。

存儲(chǔ)過程優(yōu)化思路:

  1. 盡量利用一些 sql 語句來替代一些小循環(huán),例如聚合函數(shù),求平均函數(shù)等。

  2. 中間結(jié)果存放于臨時(shí)表,加索引。

  3. 少使用游標(biāo)。sql 是個(gè)集合語言,對于集合運(yùn)算具有較高性能。而 cursors 是過程運(yùn)算。比如對一個(gè) 100 萬行的數(shù)據(jù)進(jìn)行查詢。游標(biāo)需要讀表 100 萬次,而不使用游標(biāo)則只需要少量幾次讀取。

  4. 事務(wù)越短越好。sqlserver 支持并發(fā)操作。如果事務(wù)過多過長,或者隔離級別過高,都會(huì)造成并發(fā)操作的阻塞,死鎖。導(dǎo)致查詢極慢,cpu 占用率極地。

  5. 使用 try-catch 處理錯(cuò)誤異常。

  6. 查找語句盡量不要放在循環(huán)內(nèi)。

觸發(fā)器(一段能自動(dòng)執(zhí)行的程序)

觸發(fā)器是一段能自動(dòng)執(zhí)行的程序,是一種特殊的存儲(chǔ)過程,觸發(fā)器和普通的存儲(chǔ)過程的區(qū)別是:觸發(fā)器是當(dāng)對某一個(gè)表進(jìn)行操作時(shí)觸發(fā)。諸如:update、insert、delete 這些操作的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用執(zhí)行該表上對應(yīng)的觸發(fā)器。SQL Server 2005 中觸發(fā)器可以分為兩類:DML 觸發(fā)器和DDL 觸發(fā)器,其中 DDL 觸發(fā)器它們會(huì)影響多種數(shù)據(jù)定義語言語句而激發(fā),這些語句有 create、alter、drop 語句。

數(shù)據(jù)庫并發(fā)策略

并發(fā)控制一般采用三種方法,分別是樂觀鎖和悲觀鎖以及時(shí)間戳。

樂觀鎖

樂觀鎖認(rèn)為一個(gè)用戶讀數(shù)據(jù)的時(shí)候,別人不會(huì)去寫自己所讀的數(shù)據(jù);悲觀鎖就剛好相反,覺得自己讀數(shù)據(jù)庫的時(shí)候,別人可能剛好在寫自己剛讀的數(shù)據(jù),其實(shí)就是持一種比較保守的態(tài)度;時(shí)間戳就是不加鎖,通過時(shí)間戳來控制并發(fā)出現(xiàn)的問題。

悲觀鎖

悲觀鎖就是在讀取數(shù)據(jù)的時(shí)候,為了不讓別人修改自己讀取的數(shù)據(jù),就會(huì)先對自己讀取的數(shù)據(jù)加鎖,只有自己把數(shù)據(jù)讀完了,才允許別人修改那部分?jǐn)?shù)據(jù),或者反過來說,就是自己修改某條數(shù)據(jù)的時(shí)候,不允許別人讀取該數(shù)據(jù),只有等自己的整個(gè)事務(wù)提交了,才釋放自己加上的鎖,才允許其他用戶訪問那部分?jǐn)?shù)據(jù)。

時(shí)間戳

時(shí)間戳就是在數(shù)據(jù)庫表中單獨(dú)加一列時(shí)間戳,比如“TimeStamp”,每次讀出來的時(shí)候,把該字段也讀出來,當(dāng)寫回去的時(shí)候,把該字段加1,提交之前 ,跟數(shù)據(jù)庫的該字段比較一次,如果比數(shù)據(jù)庫的值大的話,就允許保存,否則不允許保存,這種處理方法雖然不使用數(shù)據(jù)庫系統(tǒng)提供的鎖機(jī)制,但是這種方法可以大大提高數(shù)據(jù)庫處理的并發(fā)量,以上悲觀鎖所說的加“鎖”,其實(shí)分為幾種鎖,分別是:排它鎖(寫鎖)和共享鎖(讀鎖)。

數(shù)據(jù)庫鎖

行級鎖

行級鎖是一種排他鎖,防止其他事務(wù)修改此行;在使用以下語句時(shí),Oracle 會(huì)自動(dòng)應(yīng)用行級鎖:

  1. INSERT、UPDATE、DELETE、SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT];

  2. SELECT … FOR UPDATE 語句允許用戶一次鎖定多條記錄進(jìn)行更新

  3. 使用 COMMIT 或 ROLLBACK 語句釋放鎖。

表級鎖

表示對當(dāng)前操作的整張表加鎖,它實(shí)現(xiàn)簡單,資源消耗較少,被大部分 MySQL 引擎支持。最常使用的 MYISAM 與 INNODB 都支持表級鎖定。表級鎖定分為表共享讀鎖(共享鎖)與表獨(dú)占寫鎖

(排他鎖)。

頁級鎖

頁級鎖是 MySQL 中鎖定粒度介于行級鎖和表級鎖中間的一種鎖。表級鎖速度快,但沖突多,行級沖突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。BDB 支持頁級鎖


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI