1. 什么是存儲引擎
? ? ? ?關系數據表是用于存儲和組織信息的數據結構,可以將表理解為由行和列組成的表格,類似于excel的電子表格的形式。有的表簡單,有的表復雜,有的表根本不用來存儲任何長期的數據,有的表讀取時非???,但是插入數據時很差;而在我們實際開發(fā)過程中,就可能需要各種各樣的表,不同的表,就意味著存儲不同類型的數據,數據的處理上也會存在著差異。
? ? ? ? MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善應用的整體功能。
? ? ? ?例如,如果你在研究大量的臨時數據,你也許需要使用內存存儲引擎。內存存儲引擎能夠在內存中存儲所有的表格數據。又或者,你也許需要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回滾能力)。
? ? ? ?這些不同的技術以及配套的相關功能在MySQL中被稱作存儲引擎(也稱作表類型)。 對于MySQL來說,它提供了很多種類型的存儲引擎,我們可以根據對數據處理的需求,選擇不同的存儲引擎,從而最大限度的利用MySQL強大的功能。。?
? ? ? ?mysql5.5以后,默認使用InnoDB搜索引擎。若要修改默認引擎,可以修改配置文件中的default-storage-engine。 命令:show engines和show variables like ‘have%’可以列出當前數據庫支持的引擎,其中value顯示為disabled的記錄表示數據庫支持此引擎,但在數據庫啟動時被禁用了;還可以通過show variables like ‘default_storage_engine’,查看當前數據庫的默認引擎。
2.?MyISAM與InnoDB的區(qū)別選擇
雖然MySQL里的存儲引擎不只是MyISAM與InnoDB這兩個,但常用的就是這兩個。
兩種存儲引擎的主要區(qū)別表現(xiàn)在:
1)InnoDB支持事務,MyISAM不支持。這一點是非常之重要。事務是一種高級的處理方式,用來維持數據庫的完整性,它保證成批的SQL語句要么去要么執(zhí)行,要么全部不執(zhí)行。當執(zhí)行執(zhí)行過程出錯,事務會回滾到事務開始前的初始狀態(tài),只用于管理增刪改;
2)InnoDB支持數據行鎖定,MyISAM不支持行鎖定,只支持鎖定整個表。即 MyISAM同一個表上的讀鎖和寫鎖是互斥的,MyISAM并發(fā)讀寫時如果等待隊列中既有讀請求又有寫請求,默認寫請求的優(yōu)先級高,即使讀請求先到,所以 MyISAM不適合于有大量查詢和修改并存的情況,那樣查詢進程會長時間阻塞。因為MyISAM是鎖表,所以某項讀操作比較耗時會使其他寫進程餓死。MyISAM適合查詢以及插入為主的應用。
3)InnoDB支持外鍵,MyISAM不支持外鍵。
外鍵:若一張表中有一個非主鍵字段指向了別一張表中的主鍵,則將該字段叫做外鍵。? ? ? ? ? ? ? ?一張表中可以有多個外鍵。
外鍵的默認作用有兩點,用來保持數據的一致性和完整性:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1.對子表(外鍵所在的表)的作用:子表在進行寫操作的時候,如果外鍵字段在父表中找不到對應的匹配,操作就會失敗。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.對父表的作用:對父表的主鍵字段進行刪和改時,如果對應的主鍵在子表中被引用,操作就會失敗。
外鍵的定制作用----三種約束模式:置空、級聯(lián)、禁止
4)?InnoDB 把數據和索引存放在表空間里面,MyISAM 表被存放在三個文件 。frm 文件存放表格定義。 數據文件是MYD (MYData) 。 索引文件是MYI (MYIndex)
4)從MySQL5.5.5以后,InnoDB是默認引擎。
5)InnoDB不支持FULLTEXT類型的索引。但是InnoDB可以使用sphinx插件支持全文索引。
6)InnoDB中不保存表的行數,如select count(*) from table時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含where條件時MyISAM也需要掃描整個表。
沒有where的count(*)使用MyISAM要比InnoDB快得多。因 為MyISAM內置了一個計數器,count(*)時它直接從計數器中讀,而InnoDB必須掃描全表。所以在InnoDB上執(zhí)行count(*)時一般 要伴隨where,且where中要包含主鍵以外的索引列。為什么這里特別強調“主鍵以外”?因為InnoDB中primary index是和raw data存放在一起的,而secondary index則是單獨存放,然后有個指針指向primary key。所以只是count(*)的話使用secondary index掃描更快,而primary key則主要在掃描索引同時要返回raw data時的作用較大。
7)對于自增長的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯(lián)合索引。
8)清空整個表時,InnoDB是一行一行的刪除,效率非常慢。MyISAM則會先drop表,然后重建表。
二、 關于MyISAM與InnoDB選擇使用:
MYISAM和INNODB是Mysql數據庫提供的兩種存儲引擎。兩者的優(yōu)劣可謂是各有千秋。INNODB會支持一些關系數據庫的高級功能,如事務功能和行級鎖,MYISAM不支持。MYISAM的性能更優(yōu),占用的存儲空間少。所以,選擇何種存儲引擎,視具體應用而定:
1)如果你的應用程序一定要使用事務,毫無疑問你要選擇INNODB引擎。但要注意,INNODB的行級鎖是有條件的。在where條件沒有使用主鍵時,照樣會鎖全表。比如DELETE FROM mytable這樣的刪除語句。
2)如果你的應用程序對查詢性能要求較高,就要使用MYISAM了。MYISAM索引和數據是分開的,而且其索引是壓縮的,可以更好地利用內存。所以它的查詢性能明顯優(yōu)于INNODB。壓縮后的索引也能節(jié)約一些磁盤空間。MYISAM擁有全文索引的功能,這可以極大地優(yōu)化LIKE查詢的效率。
有人說MYISAM只能用于小型應用,其實這只是一種偏見。
如果數據量比較大,這是需要通過升級架構來解決,比如分表分庫,而不是單純地依賴存儲引擎。
現(xiàn)在一般都是選用innodb了,主要是myisam的全表鎖,讀寫串行問題,并發(fā)效率鎖表,效率低myisam對于讀寫密集型應用一般是不會去選用的。
三、 關于Mysql數據庫默認的存儲引擎:
MyISAM和InnoDB是MySQL的兩種存儲引擎。
如果是默認安裝,那就應該是InnoDB,你可以在my.cnf文件中找到default-storage-engine=INNODB;
當然你可以在建表時指定相應的存儲引擎。
通過show create table xx 可以看見相應信息。
四、 Mysql中InnoDB和MyISAM的比較
1)MyISAM:
每個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。
.frm文件存儲表定義;
.MYD (MYData)文件存儲表的數據;
.MYI (MYIndex) 文件存儲表的索引。
MyISAM表格可以被壓縮,而且它們支持全文搜索。不支持事務,而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。在進行updata時進行表鎖,并發(fā)量相對較小。如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。
MyISAM的索引和數據是分開的,并且索引是有壓縮的,內存使用率就對應提高了不少。能加載更多索引,而Innodb是索引和數據是緊密捆綁的,沒有使用壓縮從而會造成Innodb比MyISAM體積龐大不小。
MyISAM緩存在內存的是索引,不是數據。而InnoDB緩存在內存的是數據,相對來說,服務器內存越大,InnoDB發(fā)揮的優(yōu)勢越大。
優(yōu)點:查詢數據相對較快,適合大量的select,可以全文索引。
缺點:不支持事務,不支持外鍵,并發(fā)量較小,不適合大量update
2)InnoDB:
這種類型是事務安全的。它與BDB類型具有相同的特性,它們還支持外鍵。InnoDB表格速度很快。具有比BDB還豐富的特性,因此如果需要一個事務安全的存儲引擎,建議使用它。在update時表進行行鎖,并發(fā)量相對較大。如果你的數據執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表。
優(yōu)點:支持事務,支持外鍵,并發(fā)量較大,適合大量update。
缺點:查詢數據相對較快,不適合大量的select。
對于支持事物的InnoDB類型的表,影響速度的主要原因是AUTOCOMMIT默認設置是打開的,而且程序沒有顯式調用BEGIN 開始事務,導致每插入一條都自動Commit,嚴重影響了速度??梢栽趫?zhí)行sql前調用begin,多條sql形成一個事物(即使autocommit打開也可以),將大大提高性能。
基本的差別為:
MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。
MyISAM類型的表強調的是性能,其執(zhí)行數度比InnoDB類型更快,但是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能
轉載自https://www.cnblogs.com/y-rong/p/5309392.html
https://baijiahao.baidu.com/s?id=1605305493612559030&wfr=spider&for=pc