mysql-5.1版本之前默認引擎是MyISAM,之後是innoDB。
MyISAM是非集聚引擎,支持全文索引;不支持事務;它是表級鎖;會保存表的具體行數。innoDB是集聚引擎,5.6以後才有全文索引;支持事務;它是行級鎖;不會保存表的具體行數。一般:不用事務的時候,count計算旁燃多的時候適合myisam引擎。對可靠性要求高就是用innodby引擎。
MySQL有9種存儲引擎,不同的引擎,適合不同的場景,我們最常用的,可能就是InnoDB,應該是從5.5開始,就成為了MySQL的默認存儲引擎。InnoDB是事務型資料庫的首選引擎,支持事務安全表(ACID),支持行鎖定和卜洞外鍵型啟枯,InnoDB是默認的MySQL引擎。
Ⅱ innodb存儲引擎支持全文索引嗎
innodb存儲引擎是不支持全文索引的,因為MySQL中的存儲引擎了解情況,InnoDB存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全,但不支持全文索引。
Ⅲ 什麼是MySQL存儲引擎
MySQL 可能是最著名的 關系資料庫管理系統 (RDBMS),作為一款免費開源軟體開發,最初由 MYSQL AB 公司提供支持,但現在歸 Oracle 所有。
在 MySQL 中,用於表的「存儲引擎」決定了數據的處理方式。有幾種可用的存儲引擎,但最常用的是 InnoDB 和 MyISAM 。
在本文中,我們將了解它們的顯著特徵以及它們之間的主要區別。
在本教程中,您將學習:
在我們討論兩個主要 MySQL 存儲引擎之間的特性和區別之前,先來了解一下什麼是存儲引擎?
存儲引擎,也稱為「 表處理程序 」,基本上是解釋和管理與資料庫表的 SQL 查詢相關的操作的資料庫部分。
在最新版本的 MySQL 中,可以使用「 可插拔 」架構來組織和管理存儲引擎,存在多種存儲引擎,但最常用的兩個是 InnoDB 和 MyISAM 。
要獲得我們正在使用的資料庫中可用存儲引擎的列表,我們所要做的就是發出一個簡單的 SQL 查詢,因此我們需要做的第一件事就是打開一個 MySQL 互動式提示並使用資料庫用戶登錄及其密碼:
如果登錄成功,提示將變為mysql>,在這里,我們可以運行我們的 SQL 查詢來可視化可用的存儲引擎:
執行查詢後,我們應該獲得類似於以下內容的結果:
在上表中,作為查詢結果生成,我們可以通過查看Support每行列中的值輕鬆了解支持哪些存儲引擎,「YES」值表示存儲引擎可用,否則「NO」。相反,同一列中的「DEFAULT」值表示相應的引擎(在本例中為 InnoDB)是伺服器使用的默認引擎。
「 Transactions 」和「 Savepoints 」列中存在的值分別表示存儲引擎是否支持事務和回滾。正如我們通過查看錶可以看到的,只有 InnoDB 引擎可以。
關於存儲引擎的信息存在於「 INFORMATION_SCHEMA 」資料庫的「 ENGINES 」表中,因此我們也可以發出標準的「SELECT」查詢來獲取我們需要的數據:
我們將獲得與上面看到的相同的結果。
讓我們看看兩個最常用的存儲引擎 InnoDB 和 MyISAM 之間的主要特性和區別是什麼。
正如我們已經說過的, InnoDB 是自 MySQL 以來的默認存儲引擎5.5。
此存儲引擎的一些主要功能如下:
對事務的支持提供了一種安全的方式來執行多個查詢以保持數據一致。
當多個修改數據的操作被執行並且我們想要確保它們只有在所有操作都成功並且沒有錯誤發生時才有效時,我們想要使用事務。
典型的處理方式是啟動事務並執行查詢:如果出現錯誤,則執行回滾,否則提交更改。
當使用 InnoDB 數據鎖定發生在行級別時,因此在事務期間鎖定的數據量是有限的。
InnoDB 有兩種類型的鎖:
一個共享鎖允許誰擁有它讀取該行的交易,而一個排它鎖允許交易執行其修改行的操作,所以要更新或刪除數據。
當一個事務在某行上獲得共享鎖,而另一個事務需要相同的鎖類型時,立即授予;但是,如果第二個事務在同一行上請求排他鎖,它將不得不等待。
如果第一個事務持有該行的排他鎖,則第二個事務將不得不等待該鎖被釋放以獲得共享鎖或排他鎖。
外鍵是一個非常重要的特性,因為它們可用於基於表之間的邏輯關系來強制執行數據完整性。想像一下,我們的資料庫中有三個表(假設它被稱為「testdb」):一個user包含現有用戶的job表,一個注冊所有可用作業的user_job表,以及一個用於表示用戶和用戶之間存在的多對多關系的表。作業(一個用戶可以有多個作業,多個作業可以與同一個用戶關聯)。
該user_job表就是所謂的連接表或關聯表,因為它的唯一目的是表示用戶-工作關聯。該表有兩列,一個叫user_id和其他job id。表中會存在兩個外鍵約束,強制執行以下規則:user_id列中的值只能引用表id列中的值,列中的user值job_id必須引用表id列中的現有值job.
這將強制執行完整性,因為僅允許現有用戶和作業的 ID 存在於關聯表中。刪除涉及表中一個或多個關聯的用戶或作業user_job也是不允許的,除非為相應的外鍵設置了CASCADE DELETE規則。在這種情況下,當刪除用戶或作業時,它們所涉及的關系也將被刪除。
MyISAM 曾經是默認的 MySQL 存儲引擎,但已被 InnoDB 取代。使用此引擎時,數據鎖定發生在表級別,因此執行操作時鎖定的數據更多。
與 InnoDB 不同,MyISAM 不支持事務回滾和提交,因此必須手動執行回滾。MyISAM 和 InnoDB 之間的另一個很大區別是前者不支持外鍵。MyISAM 更簡單,並且在對有限數據集進行讀取密集型操作時可能具有優勢(有爭議)。
在表上使用 MyISAM 時,會設置一個標志,指示該表是否需要修復,例如在突然關閉之後。稍後可以使用適當的工具執行表修復。
如何知道特定表使用了什麼存儲引擎?我們所要做的就是發出一個簡單的查詢。
例如,要知道user我們在前面的例子中提到的表使用了什麼存儲引擎,我們將運行:
注意上面的查詢我們使用了G,為了讓查詢結果垂直顯示,優化空間。執行查詢後,我們將獲得以下結果:
在這種情況下,通過查看「Engine」列中存儲的值,我們可以清楚地看到該表使用的是「InnoDB」引擎。獲取相同信息的另一種方法是INFORMATION_SCHEMA.TABLES直接查詢表:
上面的查詢將只返回表使用的引擎:
如果我們稍微更改查詢,我們可以獲得資料庫中所有表名的列表以及它們使用的引擎:
如果我們要為一個表設置一個特定的存儲引擎,我們可以在創建時指定它。例如,假設我們正在創建job表,並且出於某種原因我們想要使用 MyISAM 存儲引擎。我們將發出以下 SQL 查詢:
相反,如果我們想要更改用於已存在表的存儲引擎,我們只需要使用ALTERSQL 語句。假設我們要將上一個示例中創建的「job」表所使用的存儲引擎更改為 InnoDB;我們會運行:
在本教程中,我們學習了什麼是資料庫存儲引擎,並且我們看到了兩個最常用的 MySQL 引擎的主要特性: InnoDB 和 MyISAM 。
我們看到了如何檢查哪些引擎可用、哪些引擎用於表以及如何使用 SQL 查詢設置和修改表引擎。
Ⅳ Mysql資料庫3種存儲引擎有什麼區別(mysql資料庫的存儲引擎有哪些)
MySQL常見的三種存儲引擎為InnoDB、MyISAM和MEMORY。其區別體現在事務安全、存儲限制、空間使用、內存使用、插入數據的速度和對外鍵的支持。具體如下:
1、事務安全:
InnoDB支持事務安全,MyISAM和MEMORY兩個不支持。
2、存儲限制:
InnoDB有64TB的存儲限制,MyISAM和MEMORY要是具體情況而定。
3、空間使用:
InnoDB對空間使用程度較高,MyISAM和MEMORY對空間使用程度較低。
4、內存使用:
InnoDB和MEMORY對內存使用程度較高,MyISAM對內存使用程度較低。
5、插入數據的速度:
InnoDB插入數據的速度較低,MyISAM和MEMORY插入數據的速度較高。
6、對外鍵的支持:
InnoDB對外鍵支持情況較好,MyISAM和MEMORY兩個不支持外鍵。
三種引擎特點如下:
1、InnoDB存儲引擎
InnoDB是事務型資料庫的首選引擎,支持事務安全表(ACID),其它存儲引擎都是非事務安全表,支持行鎖定和外鍵,MySQL5.5以後默認使用InnoDB存儲引擎。
InnoDB特點:支持事務處理,支持外鍵,支持崩潰修復能力和並發控制。如果需要對事務的完整性要求比較高(比如銀行),要求實現並發控制(比如售票),那選擇InnoDB有很大的優勢。
如果需要頻繁的更新、刪除操作的資料庫,也可以選擇InnoDB,因為支持事務的提交(commit)和回滾(rollback)租芹。
2、MyISAM存儲引擎
MyISAM基於ISAM存儲引擎,並對其進行擴展。它是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。MyISAM擁有較高的插入、查詢速度,但不支持事務,不支持外鍵。
MyISAM特點:插入數據快,空間和內存使用比較低。如果表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM能實現處理高效率。如果應用的完整性、並發性要求比較低,也可以使用
3、MEMORY存儲引擎
MEMORY存儲引擎將表中的數據存儲到內存中,為查詢和引用其他表數據提供快速訪問。
MEMORY特點:所有的數據都在內存中,數據的處理速度快,但是安全性不高。如果需要很快的讀寫速度,對數據的安全性要求較低,可以選擇MEMOEY。
它對表的大小有要求,不能建立太大的表。所以,這類資料庫只使用在相對較小的資料庫表。
(4)innodb資料庫引擎擴展閱讀:
mysql其餘不太常見的存儲引擎如下:
1、BDB:源自BerkeleyDB,事務型資料庫的另一種選擇,支持COMMIT和ROLLBACK等其他事務特性
2、Merge:將一定數量的MyISAM表聯合而成一個整體,在超大規模數據存儲時很有用
3、Archive:非常適合存儲大量稿型慧的獨立的,作為歷史記錄的數據。因為它們不經常被讀取。Archive擁有高效的插入速度,但其對查詢的支持相對較差
4、Federated:將不同的Mysql伺服器聯合起來,邏輯上組成一個完整的資料庫。非常適合分布式應用
5、Cluster/NDB:高冗餘的存儲引擎,用多台數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用
6、CSV:邏輯上由逗號分割數據的存儲引擎。它會在資料庫子目錄里為每個數據表創建一個.CSV文件。這是一種普通文本文件,每個數據行佔用鍵答一個文本行。CSV存儲引擎不支持索引。
7、BlackHole:黑洞引擎,寫入的任何數據都會消失,一般用於記錄binlog做復制的中繼
Ⅳ mysql的innodb引擎特點
1.插入緩沖(insert buffer)
插入緩沖(Insert Buffer/Change Buffer):提升插入性能,change buffering是insert buffer的加強,insert buffer只針對insert有效,change buffering對insert、delete、update(delete+insert)、purge都有效
只對於非聚集索引(非唯一)的插入和更新有效,對於每一次的插入不是寫到索引頁中,而是先判斷插入的非聚集索引頁是否在緩沖池中,如果在則直接插入;若不在,則先放到Insert Buffer 中,再按照一定的頻率進行合並操作,再寫回disk。這樣通常能將多個插入合並到一個操作中,目的還是為了減少隨機IO帶來性能損耗。
2.二次寫(double write)
Doublewrite緩存是位於系統表空間的存儲區域,用來緩存InnoDB的數據頁從innodb buffer pool中flush之後並寫入到數據文件之前,所以當操作系統或者資料庫進程在數據頁寫磁碟的過程中崩潰,Innodb可以在doublewrite緩存中找到數據頁的備份而用來執行crash恢復。數據頁寫入到doublewrite緩存的動作所需要的IO消耗要小於寫入到數據文件的消耗,因為此寫入操作會以一次大的連續塊的方式寫入
在應用(apply)重做日誌前,用戶需要一個頁的副本,當寫入失效發生時,先通過頁的副本來還原該頁,再進行重做,這就是double write
doublewrite組成:
內存中的doublewrite buffer,大小2M。
物理磁碟上共享表空間中連續的128個頁,即2個區(extend),大小同樣為2M。
對緩沖池的臟頁進行刷新時,不是直接寫磁碟,而是會通過memcpy()函數將臟頁先復制到內存中的doublewrite buffer,之後通過doublewrite 再分兩次,每次1M順序地寫入共享表空間的物理磁碟上,在這個過程中,因為doublewrite頁是連續的,因此這個過程是順序寫的,開銷並不是很大。在完成doublewrite頁的寫入後,再將doublewrite buffer 中的頁寫入各個 表空間文件中,此時的寫入則是離散的。如果操作系統在將頁寫入磁碟的過程中發生了崩潰,在恢復過程中,innodb可以從共享表空間中的doublewrite中找到該頁的一個副本,將其復制到表空間文件,再應用重做日誌。
3.自適應哈希索引(ahi)
Adaptive Hash index屬性使得InnoDB更像是內存資料庫。該屬性通過innodb_adapitve_hash_index開啟,也可以通過—skip-innodb_adaptive_hash_index參數
關閉
Innodb存儲引擎會監控對表上二級索引的查找,如果發現某二級索引被頻繁訪問,二級索引成為熱數據,建立哈希索引可以帶來速度的提升
經常訪問的二級索引數據會自動被生成到hash索引裡面去(最近連續被訪問三次的數據),自適應哈希索引通過緩沖池的B+樹構造而來,因此建立的速度很快。
哈希(hash)是一種非常快的等值查找方法,在一般情況下這種查找的時間復雜度為O(1),即一般僅需要一次查找就能定位數據。而B+樹的查找次數,取決於B+樹的高度,在生產環境中,B+樹的高度一般3-4層,故需要3-4次的查詢
4.預讀(read ahead)
InnoDB使用兩種預讀演算法來提高I/O性能:線性預讀(linear read-ahead)和隨機預讀(randomread-ahead)
為了區分這兩種預讀的方式,我們可以把線性預讀放到以extent為單位,而隨機預讀放到以extent中的page為單位。線性預讀著眼於將下一個extent提前讀取到buffer pool中,而隨機預讀著眼於將當前extent中的剩餘的page提前讀取到buffer pool中