數據庫面試知識點(四)存儲引擎

1.MySQL 常見的兩種存儲引擎(InnoDB、MyISAM)的區別?

兩種存儲引擎的大致區別表現在:

  1. InnoDB 支持事務,MyISAM 不支持, 這一點是非常之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而 MyISAM 就不可以了。

  2. MyISAM 適合查詢以及插入爲主的應用。

  3. InnoDB 適合頻繁修改以及涉及到安全性較高的應用。

  4. InnoDB 支持外鍵,MyISAM 不支持。

  5. 從 MySQL5.5.5 以後,InnoDB 是默認引擎。

  6. InnoDB 不支持 FULLTEXT 類型的索引。

  7. InnoDB 中不保存表的行數,如 select count () from table 時,InnoDB 需要掃描一遍整個表來計算有多少行,但是 MyISAM 只要簡單的讀出保存好的行數即可。注意的是,當 count () 語句包含 where 條件時 MyISAM 也需要掃描整個表。

  8. 對於自增長的字段,InnoDB 中必須包含只有該字段的索引,但是在 MyISAM 表中可以和其他字段一起建立聯合索引。

  9. DELETE FROM table 時,InnoDB 不會重新建立表,而是一行一行的 刪除,效率非常慢。MyISAM 則會重建表。

  10. InnoDB 支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like ‘% lee%’。


2.MySQL 存儲引擎 MyISAM 與 InnoDB 如何選擇

MySQL 有多種存儲引擎,每種存儲引擎有各自的優缺點,可以擇優選擇使用:MyISAM、InnoDB、MERGE、MEMORY (HEAP)、BDB (BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

雖然 MySQL 裏的存儲引擎不只是 MyISAM 與 InnoDB 這兩個,但常用的就是兩個
關於 MySQL 數據庫提供的兩種存儲引擎,MyISAM 與 InnoDB 選擇使用:

1.INNODB 會支持一些關係數據庫的高級功能,如事務功能和行級鎖,MyISAM 不支持。
2.MyISAM 的性能更優,佔用的存儲空間少,所以,選擇何種存儲引擎,視具體應用而定。

如果你的應用程序一定要使用事務,毫無疑問你要選擇 INNODB 引擎。但要注意,INNODB 的行級鎖是有條件的。在 where 條件沒有使用主鍵時,照樣會鎖全表。比如 DELETE FROM mytable 這樣的刪除語句。

如果你的應用程序對查詢性能要求較高,就要使用 MyISAM 了。MyISAM 索引和數據是分開的,而且其索引是壓縮的,可以更好地利用內存。所以它的查詢性能明顯優於 INNODB。壓縮後的索引也能節約一些磁盤空間。MyISAM 擁有全文索引的功能,這可以極大地優化 LIKE 查詢的效率。

有人說 MyISAM 只能用於小型應用,其實這只是一種偏見。如果數據量比較大,這是需要通過升級架構來解決,比如分表分庫,而不是單純地依賴存儲引擎。

現在一般都是選用 innodb 了,主要是 MyISAM 的全表鎖,讀寫串行問題,併發效率鎖表,效率低,MyISAM 對於讀寫密集型應用一般是不會去選用的。

3.MEMORY 存儲引擎

MEMORY 是 MySQL 中一類特殊的存儲引擎。它使用存儲在內存中的內容來創建表,而且數據全部放在內存中。這些特性與前面的兩個很不同。

每個基於 MEMORY 存儲引擎的表實際對應一個磁盤文件。該文件的文件名與表名相同,類型爲 frm 類型。該文件中只存儲表的結構。而其數據文件,都是存儲在內存中,這樣有利於數據的快速處理,提高整個表的效率。值得注意的是,服務器需要有足夠的內存來維持 MEMORY 存儲引擎的表的使用。如果不需要了,可以釋放內存,甚至刪除不需要的表。

MEMORY 默認使用哈希索引。速度比使用 B 型樹索引快。當然如果你想用 B 型樹索引,可以在創建索引時指定。

注意,MEMORY 用到的很少,因爲它是把數據存到內存中,如果內存出現異常就會影響數據。如果重啓或者關機,所有數據都會消失。因此,基於 MEMORY 的表的生命週期很短,一般是一次性的。


4.MySQL 的 MyISAM 與 InnoDB 兩種存儲引擎在,事務、鎖級別,各自的適用場景?

事務處理上方面

MyISAM:強調的是性能,每次查詢具有原子性,其執行數度比 InnoDB 類型更快,但是不提供事務支持。

InnoDB:提供事務支持事務,外部鍵等高級數據庫功能。 具有事務 (commit)、回滾 (rollback) 和崩潰修復能力 (crash recovery capabilities) 的事務安全 (transaction-safe (ACID compliant)) 型表。

鎖級別

MyISAM:只支持表級鎖,用戶在操作 MyISAM 表時,select,update,delete,insert 語句都會給表自動加鎖,如果加鎖以後的表滿足 insert 併發的情況下,可以在表的尾部插入新的數據。

InnoDB:支持事務和行級鎖,是 innodb 的最大特色。行鎖大幅度提高了多用戶併發操作的新能。但是 InnoDB 的行鎖,只是在 WHERE 的主鍵是有效的,非主鍵的 WHERE 都會鎖全表的。


【Java 面試那點事】

這裏致力於分享 Java 面試路上的各種知識,無論是技術還是經驗,你需要的這裏都有!

這裏可以讓你【快速瞭解 Java 相關知識】,並且【短時間在面試方面有跨越式提升】

面試路上,你不孤單!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章