從儲存引擎了解MySQL

2021-10-24 04:12:52 字數 3397 閱讀 8869

儲存引擎,是mysql的資料訪問方式,不同的儲存引擎對資料有著不同的管理方式,而mysql中使用較多的兩個儲存引擎,或者說比較顯著的兩個儲存引擎:myisam和innodb,對資料有著不同的管理方式,其中innodb目前是mysql的預設儲存引擎,進入mysql檢視儲存引擎如圖:

接下來我們從這兩個儲存引擎來剖析一下mysql的大部分性質。

索引是儲存在資料庫底層的一種資料結構,它可以使得資料庫查詢的效率加倍,而mysql的索引使用的是b+樹。

性質:b+樹是一棵多路樹,其父節點的每乙個元素都會出現在子節點中,是子節點中最大或者最小的值,根節點最大的元素等同於整棵樹的最大元素,所以無論以後插入多少元素,最大的元素始終要保持包含在根節點當中,而因為父節點的元素全部都出現在子節點當中,所以所有的葉子節點包含了全部的節點資訊,每個葉子節點都帶有指向下乙個節點的指標,形成乙個有序鍊錶。

查詢過程:

而b+樹的好處主要體現在查詢上,在單元素查詢時,b+樹向下逐層查詢節點,最終匹配到葉子節點,如果是聚集索引則直接取值,如果是非聚集索引則根據位址取值。

與b-樹的差別:

b+樹中間的節點沒有衛星資料,所以同樣大小的磁碟頁可以容納更多的節點元素,這就意味著資料量相同的情況下查詢io次數會更少,再有,b+樹必須查詢到葉子節點,而b-樹只要找到匹配元素,所以b-樹的查詢效能並不穩定,而b+樹的查詢是穩定的。而且b-樹是中序遍歷查詢,而b+樹只需要在鍊錶上遍歷即可。

聚集索引:

聚集索引是指索引在建立時會將資料同時儲存在索引中,也就是說,在查詢到索引時,資料也就被同步查詢到了,聚集索引的差別可以和非聚集索引對比著看。

非聚集索引:

非聚集索引是指建立索引時,資料不儲存到索引中,索引中僅儲存資料的位址,所以當在索引中查到資料時,我們還需要按照其儲存的位址去查詢資料。

myisam

innodb

採用非聚集索引

採用聚集索引

輔助索引儲存的是值的位址

輔助索引中儲存的是主索引的值

支援全文索引

不支援全文索引

事務是一組sql語句的集合,myisam並不支援事務,innodb支援事務,針對innodb來看一下事務,事務有四種性質:原子性,一致性,隔離性,永久性(acid)。

因為事務是一組sql語句的集合,而事務的原子性就是指該集合要麼全部執行成功,要麼全部執行失敗,不能出現執行一半而失敗的情況。如果沒有完全執行成功,則會進行回滾(rollback)。

事務執行的結果必須是使資料庫從乙個一致性狀態轉換到另乙個一致性狀態。一致性與原子性密切相關,需要將事務對應的需要操作的物理資料都更改,否則會出現問題、

隔離性是四個特性中比較重要的乙個,首先我們需要知道如果沒有隔離性會出現什麼問題:

出現的問題

出現原因

髒讀由於事務讀取到了其他事務執行過程中的結果導致髒讀

不可重複讀

由於事務進行了修改(update)操作

幻讀由於事務進行了插入(insert)或刪除(delete)操作

對可能出現的問題,資料庫設定了隔離級別來消除這些問題,而對於mysql的隔離級別有以下四個:

隔離級別

相應隔離級別下殘留的問題

未提交讀(read-uncommited)

髒讀、不可重複讀、幻讀

已提交讀(read-commited)

不可重複讀,幻讀

可重複讀(repeatable-read)

幻讀可序列化(serializable)

解決所有問題

innodb的預設隔離級別是在可重複讀(repeatable-read),可以通過命令檢視。

顯而易見在第四隔離級別時可以解決所有的問題,但為何不直接使用第四隔離級別呢?因為可序列化的代價就是所有事務都會序列執行,對資料庫操作的效率損害不是一般的大,所以在資料庫層面會有其他的機制來保證不會出現問題。

永久性是指:當乙個事務提交後,對資料庫的影響應該是持久的,不能被改變的,接下來的任何操作和故障不應該對其執行的結果有任何影響。

鎖是保證資料庫安全的基本工具,myisam引擎的鎖是基於表的,而innodb是基於行。

myisam的讀鎖稱為共享讀鎖,意義就是當加上乙個讀鎖時還可以再加上讀鎖;而myisam的寫鎖稱為獨佔寫鎖,當執行insert,delete,update操作時,會加上寫鎖,此時不能再加任何形式的鎖。因為myisam的鎖是表鎖,所以鎖的粒度會比較大。

讀寫鎖的關係

(1)讀寫鎖不相容,當已有鎖時另乙個事務只能阻塞

(2)讀鎖和讀鎖相容;

(3)寫鎖和寫鎖不相容;

(4)加鎖的語句:lock table test read(write)

性質(1)讀鎖鎖表,阻塞其他鏈結修改表的資料,不會阻塞其他鏈結查詢資料

(2)寫鎖鎖表,阻塞其他鏈結查詢和修改資料

(3)併發效率不高,所以引入了行級鎖,但不會發生死鎖

select操作不加鎖,所以select操作在任何時候都會執行,且select操作在innodb中視為了乙個事務,隔離性使得其直接可以執行不會阻塞。innodb的讀鎖稱為共享鎖(一般需要手動加,因為innodb中讀操作不加鎖),而innodb的寫鎖稱為排它鎖。因為innodb支援行鎖,所以其鎖的粒度較小

innodb加行鎖的方式:

(1)寫鎖:select * from test where id=1 for update;

(2)讀鎖:select *from test where id=1 lock in share model;

innodb的以上加鎖方式在;結束之後就解鎖了,所以需要去掉其自動提交事務的功能:

set autocommit=0;

行鎖的工作機制

innodb的行鎖是鎖定他的主索引項,當通過非索引查詢資料時,索引機制不觸發,行鎖機制也不觸發,而是觸發表鎖(innodb也支援表鎖),此時查詢同一張表則會阻塞;行鎖的開銷大於表級鎖,且可能會產生死鎖。

悲觀鎖基於悲觀概念出發,認為每一項都會失敗所以需要提前加鎖以便於後續執行成功。每個儲存引擎的鎖機制都是悲觀鎖;

樂觀鎖基於樂觀概念出發,認為每一項都會成功所以在遇上問題時才加鎖,一般是人為設計的。

意向鎖(針對innodb)

當需要向資料加鎖時,先加意向鎖(意向鎖和意向鎖不衝突),相容的情況下才允許加鎖,可能衝突時等待衝突的鎖撤銷後再加鎖;

間隙鎖鎖定的是資料間隙,不允許操作,不能在間隙中插入,也只有範圍查詢時才能加間隙鎖。

MySql 了解儲存引擎

怎麼應對不同版本 在不同的 mysql 版本中,很多特性和語法有可能是不一樣的,我們怎麼樣才能知道當前版本的語法是什麼樣呢?最好的辦法是學會使用 mysql 的幫助。a 按照層次看幫助 例如 mysql contents,mysql data types,mysql int 等等 b 快速查閱幫助 ...

MySQL 常用儲存引擎 深入了解

當表的讀操作遠遠大於寫操作,且不需要事務的支援的時候,可以選用myisam引擎。因為myisam不提供事務支援,也不支援行級鎖和外來鍵。當插入 更新操作需要寫操作時需要把整個表鎖定,效率太低。但是myisam儲存了表的行數,select count from table能直接返回表的行數而不用掃瞄全...

mysql儲存引擎 mysql儲存引擎簡介

精品推薦 什麼是儲存引擎 mysql儲存引擎是資料庫如何儲存資料 怎樣建立索引以及如何查詢更新資料等技術的實現方法,資料通過使用不同的技術儲存在檔案中,使用不同的儲存機制 索引方式來提供不同的功能。在mysql這種關係型資料中心來說,資料是以表的方式來儲存的,因此,簡單點來說,儲存引擎就是儲存和操作...