1.MySQL 常見的兩種存儲引擎(InnoDB、MyISAM)的區別?
兩種存儲引擎的大致區別表現在:
-
InnoDB 支持事務,MyISAM 不支持, 這一點是非常之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而 MyISAM 就不可以了。
-
MyISAM 適合查詢以及插入爲主的應用。
-
InnoDB 適合頻繁修改以及涉及到安全性較高的應用。
-
InnoDB 支持外鍵,MyISAM 不支持。
-
從 MySQL5.5.5 以後,InnoDB 是默認引擎。
-
InnoDB 不支持 FULLTEXT 類型的索引。
-
InnoDB 中不保存表的行數,如 select count () from table 時,InnoDB 需要掃描一遍整個表來計算有多少行,但是 MyISAM 只要簡單的讀出保存好的行數即可。注意的是,當 count () 語句包含 where 條件時 MyISAM 也需要掃描整個表。
-
對於自增長的字段,InnoDB 中必須包含只有該字段的索引,但是在 MyISAM 表中可以和其他字段一起建立聯合索引。
-
DELETE FROM table 時,InnoDB 不會重新建立表,而是一行一行的 刪除,效率非常慢。MyISAM 則會重建表。
-
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 相關知識】,並且【短時間在面試方面有跨越式提升】
面試路上,你不孤單!