MySQL各大儲存引擎

2022-09-15 08:24:14 字數 4461 閱讀 9704

最好先看下你下的mysql支援什麼資料庫引擎

儲存引擎主要有: 1. myisam , 2. innodb, 3. memory, 4. blackhole, 5. csv, 6. performance_schema, 7. archive, 8. federated , 9 mrg_myisam

(1)innodb:

定義:(預設的儲存引擎)

innodb是乙個事務型的儲存引擎,有行級鎖定和外來鍵約束。

innodb引擎提供了對資料庫acid事務的支援,並且實現了sql標準的四種隔離級別,關於資料庫事務與其隔離級別的內容請見資料庫事務與其隔離級別這型別的文章。該引擎還提供了行級鎖和外來鍵約束,它的設計目標是處理大容量資料庫系統,它本身其實就是基於mysql後台的完整資料庫系統,mysql執行時innodb會在記憶體中建立緩衝池,用於緩衝資料和索引。但是該引擎不支援fulltext型別的索引,而且它沒有儲存表的行數,當select count(*) from table時需要掃瞄全表。當需要使用資料庫事務時,該引擎當然是首選。由於鎖的粒度更小,寫操作不會鎖定全表,所以在併發較高時,使用innodb引擎會提公升效率。但是使用行級鎖也不是絕對的,如果在執行乙個sql語句時mysql不能確定要掃瞄的範圍,innodb表同樣會鎖全表。

//這個就是select鎖表的一種,不明確主鍵。增刪改查都可能會導致鎖全表,在以後我們會詳細列出。

select * from products where name='mouse' for update;

適用場景:1)經常更新的表,適合處理多重併發的更新請求。

2)支援事務。

3)可以從災難中恢復(通過bin-log日誌等)。

4)外來鍵約束。只有他支援外來鍵。

5)支援自動增加列屬性auto_increment。

mysql官方對innodb的講解:

1)innodb給mysql提供了具有提交、回滾和崩潰恢復能力的事務安全(acid相容)儲存引擎。

2)innodb鎖定在行級並且也在select語句提供乙個oracle風格一致的非鎖定讀,這些特色增加了多使用者部署和效能。沒有在innodb中擴大鎖定的需要,因為在innodb中行級鎖定適合非常小的空間。

3)innodb也支援foreign key強制。在sql查詢中,你可以自由地將innodb型別的表與其它mysql的表的型別混合起來,甚至在同乙個查詢中也可以混合。

4)innodb是為處理巨大資料量時的最大效能設計,它的cpu效率可能是任何其它基於磁碟的關聯式資料庫引擎所不能匹敵的。

5) innodb被用來在眾多需要高效能的大型資料庫站點上產生。

補充:什麼叫事務?簡稱acid

a 事務的原子性(atomicity):指乙個事務要麼全部執行,要麼不執行.也就是說乙個事務不可能只執行了一半就停止了.比如你從取款機取錢,這個事務可以分成兩個步驟:1劃卡,2出錢.不可能劃了卡,而錢卻沒出來.這兩步必須同時完成.要麼就不完成.

c 事務的一致性(consistency):指事務的執行並不改變資料庫中資料的一致性.例如,完整性約束了a+b=10,乙個事務改變了a,那麼b也應該隨之改變.

i 獨立性(isolation):事務的獨立性也有稱作隔離性,是指兩個以上的事務不會出現交錯執行的狀態.因為這樣可能會導致資料不一致.

d 永續性(durability):事務的永續性是指事務執行成功以後,該事務所對資料庫所作的更改便是持久的儲存在資料庫之中,不會無緣無故的回滾.

(2)m4yisam:

定義

myiasm是mysql預設的引擎,但是它沒有提供對資料庫事務的支援,也不支援行級鎖和外來鍵,因此當insert(插入)或update(更新)資料時即寫操作需要鎖定整個表,效率便會低一些。

myisam 儲存引擎獨立於作業系統,也就是可以在windows上使用,也可以比較簡單的將資料轉移到linux作業系統上去。

意味著:引擎在建立表的時候,會建立三個檔案,乙個是.frm檔案用於儲存表的定義,乙個是.myd檔案用於儲存表的資料,另乙個是.myi檔案,儲存的是索引。作業系統對大檔案的操作是比較慢的,這樣將表分為三個檔案,那麼.myd這個檔案單獨來存放資料自然可以優化資料庫的查詢等操作。有索引管理和字段管理。myisam還使用一種**鎖定的機制,來優化多個併發的讀寫操作,其代價是你需要經常執行optimize table命令,來恢復被更新機制所浪費的空間。

適用場景

1)不支援事務的設計,但是並不代表著有事務操作的專案不能用myisam儲存引擎,可以在service層進行根據自己的業務需求進行相應的控制。

2)不支援外來鍵的表設計。

3)查詢速度很快,如果資料庫insert和update的操作比較多的話比較適用。

4)整天 對錶進行加鎖的場景。

5)myisam極度強調快速讀取操作。

6)myiasm中儲存了表的行數,於是select count(*) from table時只需要直接讀取已經儲存好的值而不需要進行全表掃瞄。如果表的讀操作遠遠多於寫操作且不需要資料庫事務的支援,那麼myiasm也是很好的選擇。

缺點:

就是不能在表損壞後恢復資料。(是不能主動恢復)

補充:isam索引方法–索引順序訪問方法

定義:

是乙個定義明確且歷經時間考驗的資料**管理方法,它在設計之時就考慮到 資料庫被查詢的次數要遠大於更新的次數。

特性:

isam執行讀取操作的速度很快,而且不占用大量的記憶體和儲存資源。

在設計之初就預想資料組織成有固定長度的記錄,按順序儲存的。—isam是一種靜態索引結構。

缺點:

1.它不 支援事務處理

2.也不能夠容錯。如果你的硬碟崩潰了,那麼資料檔案就無法恢復了。如果你正在把isam用在關鍵任務應用程式裡,那就必須經常備份你所有的實 時資料,通過其複製特性,mysql能夠支援這樣的備份應用程式。

(3)memory(也叫heap)堆記憶體嘛:

定義

使用存在記憶體中的內容來建立表。每個memory表只實際對應乙個磁碟檔案。memory型別的表訪問非常得快,因為它的資料是放在記憶體中的,並且預設使用hash索引。

但是一旦服務關閉,表中的資料就會丟失掉。 heap允許只駐留在記憶體裡的臨時**。駐留在記憶體裡讓heap要比isam和myisam都快,但是它所管理的資料是不穩定的,而且如果在關機之前沒有進行儲存,那麼所有的資料都會丟失。在資料行被刪除的時候,heap也不會浪費大量的空間。heap**在你需要使用select表示式來選擇和操控資料的時候非常有用。

適用場景:

1)那些內容變化不頻繁的**表,或者作為統計操作的中間結果表,便於高效地堆中間結果進行分析並得到最終的統計結果。

2)目標資料比較小,而且非常頻繁的進行訪問,在記憶體中存放資料,如果太大的資料會造成記憶體溢位。可以通過引數max_heap_table_size控制memory表的大小,限制memory表的最大的大小。

3)資料是臨時的,而且必須立即可用得到,那麼就可以放在記憶體中。

4)儲存在memory表中的資料如果突然間丟失的話也沒有太大的關係。

注意: memory同時支援雜湊索引和b樹索引,b樹索引可以使用部分查詢和通配查詢,也可以使用和》=等操作符方便資料探勘,雜湊索引相等的比較快但是對於範圍的比較慢很多。

特性要求:

1)要求儲存的資料是資料長度不變的格式,比如,blob和text型別的資料不可用(長度不固定的)。

2)要記住,在用完**之後就刪除**。

(4)mrg_myisam:(分表的一種方式–水平分表)

定義:

是乙個相同的可以被當作乙個來用的myisam表的集合。「相同」意味著所有表同樣的列和索引資訊。

也就是說,他將myisam引擎的多個表聚合起來,但是他的內部沒有資料,真正的資料依然是myisam引擎的表中,但是可以直接進行查詢、刪除更新等操作。

比如:我們可能會遇到這樣的問題,同一種類的資料會根據資料的時間分為多個表,如果這時候進行查詢的話,就會比較麻煩,merge可以直接將多個表聚合成乙個表統一查詢,然後再刪除merge表(刪除的是定義),原來的資料不會影響。

(5)blackhole(黑洞引擎)

定義

任何寫入到此引擎的資料均會被丟棄掉, 不做實際儲存;select語句的內容永遠是空。

他會丟棄所有的插入的資料,伺服器會記錄下blackhole表的日誌,所以可以用於複製資料到備份資料庫。

使用場景

1)驗證dump file語法的正確性

2)以使用blackhole引擎來檢測binlog功能所需要的額外負載

3)充當日誌伺服器

MVCC與MySQL各大引擎介紹

多版本併發控制是mysql的innodb採用的併發控制方案,在可重複讀下預設使用該併發控制方案 原理 總結 通過多條記錄,多版本,只做增量的方式來保證可重複讀和併發控制 版本校驗 索引和資料分開在兩個檔案,因此支援行鎖效能不好保障,所以沒有設計支援行鎖和事務 崩潰後資料恢復困難 但是myisam的儲...

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

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

mysql個儲存引擎 MySQL儲存引擎

mysql資料庫的體系架構如下圖所示 從上圖中可以看出,mysql主要分為以下幾個元件 連線池元件 管理服務和工具元件 sql介面元件 分析器元件 優化器元件 緩衝元件 外掛程式式儲存引擎 物理檔案 儲存引擎 其實就是指定表如何儲存資料,如何為儲存的資料建立索引以及如何更新 查詢資料等技術實現的方法...