1、什么是數(shù)據(jù)庫(kù)引擎
? ? 數(shù)據(jù)庫(kù)引擎就是操作數(shù)據(jù)庫(kù)的一段程序或程序段,用于存儲(chǔ)、處理和保護(hù)數(shù)據(jù)的核心服務(wù)。
????利用數(shù)據(jù)庫(kù)引擎可控制訪問(wèn)權(quán)限并快速處理事務(wù),從而滿足企業(yè)內(nèi)大多數(shù)需要處理大量數(shù)據(jù)的應(yīng)用程序的要求。數(shù)據(jù)庫(kù)應(yīng)用項(xiàng)目是通過(guò)數(shù)據(jù)庫(kù)引擎與數(shù)據(jù)庫(kù)鏈接的。
? ? 何為數(shù)據(jù)庫(kù)引擎?簡(jiǎn)而言之,數(shù)據(jù)庫(kù)引擎就是驅(qū)動(dòng)各種數(shù)據(jù)庫(kù)的程序,它負(fù)責(zé)處理數(shù)據(jù)庫(kù)相關(guān)工作的整個(gè)核心部份。同樣的,數(shù)據(jù)庫(kù)應(yīng)用項(xiàng)目的操作指令,均會(huì)通過(guò)數(shù)據(jù)庫(kù)引擎的處理作用到數(shù)據(jù)庫(kù)上。
? ? MySQL是常用的數(shù)據(jù)庫(kù)軟件。它有諸多的優(yōu)點(diǎn),如開(kāi)源的,免費(fèi)的等。其實(shí)它還有一個(gè)很好的特點(diǎn),那就是有多種引擎可以供你選擇。MySQL數(shù)據(jù)庫(kù)引擎取決于MySQL在安裝的時(shí)候是如何被編譯的。要添加一個(gè)新的引擎,就必須重新編譯MYSQL。MYSQL常用2個(gè)引擎分別是MyISAM和InnoDB。
2、MyISAM
????在MySQL 5.5.8版本之前,MyIASM是默認(rèn)存儲(chǔ)引擎,但它沒(méi)有提供對(duì)數(shù)據(jù)庫(kù)事務(wù)的支持,也不支持行鎖和外鍵,因此當(dāng)INSERT或UPDATE數(shù)據(jù)時(shí)即寫操作需要鎖定整個(gè)表,效率便會(huì)低些,MyISAM主要面向一些OLAP(On-Line Analytical Processing)應(yīng)用。
????不過(guò)和Innodb不同,MyIASM中存儲(chǔ)了表的行數(shù),于是SELECT COUNT(*) FROM TABLE時(shí)只需要直接讀取已保存好的值而不用全表掃描。如果表的讀操作遠(yuǎn)遠(yuǎn)多于寫操作且不需要數(shù)據(jù)庫(kù)事務(wù)支持,那么MyIASM也是很好的選擇。
????此外,MyISAM另外一個(gè)與眾不同的地方在于,它的緩沖只緩沖索引文件,而不緩沖數(shù)據(jù)文件,這點(diǎn)和大多數(shù)數(shù)據(jù)庫(kù)都非常不同。
? ? MyISAM引擎使用B+Tree作為索引結(jié)構(gòu),葉節(jié)點(diǎn)的data域存放的是數(shù)據(jù)記錄的地址。MyISAM的索引方式也叫“非聚集”的,這么稱呼是為與InnoDB的聚集索引區(qū)分。下圖是MyISAM主鍵索引的原理圖:
3、InnoDB
????MySQL 5.5.8開(kāi)始,默認(rèn)的存儲(chǔ)引擎為InnoDB。Innodb引擎提供對(duì)數(shù)據(jù)庫(kù)ACID事務(wù)的支持,且實(shí)現(xiàn)了SQL標(biāo)準(zhǔn)的四種隔離級(jí)別,其設(shè)計(jì)目標(biāo)主要面向OLTP(On-Line Transaction Processing)的應(yīng)用。
????該引擎還提供了行鎖和外鍵約束,支持一致性的非鎖定讀,它的設(shè)計(jì)目標(biāo)是處理大容量數(shù)據(jù)庫(kù)系統(tǒng),它本身其實(shí)就是基于MySQL后臺(tái)的完整數(shù)據(jù)庫(kù)系統(tǒng),MySQL運(yùn)行時(shí)Innodb會(huì)在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引。但該引擎不支持FULLTEXT類型的索引,且沒(méi)有保存表的行數(shù),當(dāng)SELECT COUNT(*) FROM TABLE時(shí)要掃描全表。
????當(dāng)要使用數(shù)據(jù)庫(kù)事務(wù)時(shí),該引擎是首選。由于鎖的粒度更小,寫操作不會(huì)鎖定全表,所以在并發(fā)較高時(shí),使用Innodb引擎會(huì)提升效率。
????但使用行級(jí)鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表。
? ? Innodb引擎的索引結(jié)構(gòu)同樣也是B+Tree,但I(xiàn)nnodb的索引文件本身就是數(shù)據(jù)文件,即B+Tree的數(shù)據(jù)域存儲(chǔ)的就是實(shí)際的數(shù)據(jù),這種索引就是聚集索引。這個(gè)索引的key就是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。
????因?yàn)镮nnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可沒(méi)有),如果沒(méi)有顯式指定,則MySQL系統(tǒng)會(huì)自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)記錄的列作主鍵,如果不存在這種列,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵,這個(gè)字段長(zhǎng)度為6個(gè)字節(jié),類型為長(zhǎng)整形。
????并且和MyISAM不同,InnoDB的輔助索引數(shù)據(jù)域存儲(chǔ)的也是相應(yīng)記錄主鍵的值而不是地址,所以當(dāng)以輔助索引查找時(shí),會(huì)先根據(jù)輔助索引找到主鍵,再根據(jù)主鍵索引找到實(shí)際的數(shù)據(jù)。
????所以Innodb不建議使用過(guò)長(zhǎng)的主鍵,否則會(huì)使輔助索引變得過(guò)大。建議使用自增的字段作為主鍵,這樣B+ Tree的每一個(gè)結(jié)點(diǎn)都會(huì)被順序的填滿,而不會(huì)頻繁的分裂調(diào)整,可以有效的提升插入數(shù)據(jù)的效率。Innodb的主鍵索引和輔助索引如下圖所示:
?
?
????InnoDB 表是基于聚簇索引建立的。因此InnoDB 的索引能提供一種非常快速的主鍵查找性能。不過(guò),它的輔助索引(Secondary Index, 也就是非主鍵索引)也會(huì)包含主鍵列,所以,如果主鍵定義的比較大,其他索引也將很大。如果想在表上定義 、很多索引,則爭(zhēng)取盡量把主鍵定義得小一些。InnoDB 不會(huì)壓縮索引。?
4、MyISAM與InnoDB的區(qū)別
????InnoDB和MyISAM是使用MySQL時(shí)最常用的兩個(gè)表類型,這兩個(gè)表類型各有優(yōu)劣,視具體應(yīng)用而定。
????基本的差別為:MyISAM類型不支持事務(wù)處理等高級(jí)處理,而InnoDB類型支持。MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類型更快,但不提供事務(wù)支持,而InnoDB提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。
以下是一些細(xì)節(jié)和具體實(shí)現(xiàn)的差別:
(1)InnoDB不支持FULLTEXT類型的索引;
(2)InnoDB 中不保存表的具體行數(shù),也就是說(shuō),執(zhí)行select count(*) fromtable時(shí),InnoDB要掃描一遍整個(gè)表來(lái)計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count(*)語(yǔ)句包含where條件時(shí),兩種表的操作是一樣的;
(3)對(duì)于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。
(4)DELETE FROM table時(shí),InnoDB不會(huì)重新建立表,而是一行一行的刪除;
(5)LOAD TABLE FROMMASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用。
(5)主索引的區(qū)別,InnoDB的數(shù)據(jù)文件本身就是索引文件,而MyISAM的索引和數(shù)據(jù)是分開(kāi)的。
(6)輔助索引的區(qū)別:InnoDB的輔助索引data域存儲(chǔ)相應(yīng)記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒(méi)有多大區(qū)別。
????
- MyISAM適合:
(1)做很多count 的計(jì)算;
(2)插入不頻繁,查詢非常頻繁;
(3)沒(méi)有事務(wù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-461834.html
- InnoDB適合:
(1)要求事務(wù);
(2)表更新和查詢頻繁
(3)大尺寸的數(shù)據(jù)集趨向于選擇InnoDB引擎,因?yàn)樗С质聞?wù)處理和故障恢復(fù)。數(shù)據(jù)庫(kù)的大小決定了故障恢復(fù)的時(shí)間長(zhǎng)短,InnoDB可以利用事務(wù)日志進(jìn)行數(shù)據(jù)恢復(fù),這比較快。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-461834.html
到了這里,關(guān)于MySQL的數(shù)據(jù)庫(kù)引擎介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!