什麼是存儲引擎?
關系資料庫表是用於存儲和組織信息的數據結構,可以將表理解為由行和列組成的表格,類似於Excel的電子表格的形式。有的表簡單,有的表復雜,有的表根本不用來存儲任何長期的數據,有的表讀取時非常快,但是插入數據時去很差;而我們在實際開發過程中,就可能需要各種各樣的表,不同的表,就意味著存儲不同類型的數據,數據的處理上也會存在著差異,那麼。對於MySQL來說,它提供了很多種類型的存儲引擎,我們可以根據對數據處理的需求,選擇不同的存儲引擎,從而最大限度的利用MySQL強大的功能。這篇博文將總結和分析各個引擎的特點,以及適用場合,並不會糾結於更深層次的東西。我的學習方法是先學會用,懂得怎麼用,再去知道到底是如何能用的。下面就對MySQL支持的存儲引擎進行簡單的介紹。
MyISAM
在mysql客戶端中,使用以下命令可以查看MySQL支持的引擎。
復制代碼代碼如下:
show engines;
MyISAM表是獨立於操作系統的,這說明可以輕松地將其從Windows伺服器移植到Linux伺服器;每當我們建立一個MyISAM引擎的表時,就會在本地磁碟上建立三個文件,文件名就是表明。例如,我建立了一個MyISAM引擎的tb_Demo表,那麼就會生成以下三個文件:
1.tb_demo.frm,存儲表定義;
2.tb_demo.MYD,存儲數據;
3.tb_demo.MYI,存儲索引。
MyISAM表無法處理事務,這就意味著有事務處理需求的表,不能使用MyISAM存儲引擎。MyISAM存儲引擎特別適合在以下幾種情況下使用:
1.選擇密集型的表。MyISAM存儲引擎在篩選大量數據時非常迅速,這是它最突出的優點。
2.插入密集型的表。MyISAM的並發插入特性允許同時選擇和插入數據。例如:MyISAM存儲引擎很適合管理郵件或Web伺服器日誌數據。
InnoDB
InnoDB是一個健壯的事務型存儲引擎,這種存儲引擎已經被很多互聯網公司使用,為用戶操作非常大的數據存儲提供了一個強大的解決方案。我的電腦上安裝的MySQL 5.6.13版,InnoDB就是作為默認的存儲引擎。InnoDB還引入了行級鎖定和外鍵約束,在以下場合下,使用InnoDB是最理想的選擇:
1.更新密集的表。InnoDB存儲引擎特別適合處理多重並發的更新請求。
2.事務。InnoDB存儲引擎是支持事務的標准MySQL存儲引擎。
3.自動災難恢復。與其它存儲引擎不同,InnoDB表能夠自動從災難中恢復。
4.外鍵約束。MySQL支持外鍵的存儲引擎只有InnoDB。
5.支持自動增加列AUTO_INCREMENT屬性。
一般來說,如果需要事務支持,並且有較高的並發讀取頻率,InnoDB是不錯的選擇。
MEMORY
使用MySQL Memory存儲引擎的出發點是速度。為得到最快的響應時間,採用的邏輯存儲介質是系統內存。雖然在內存中存儲表數據確實會提供很高的性能,但當mysqld守護進程崩潰時,所有的Memory數據都會丟失。獲得速度的同時也帶來了一些缺陷。它要求存儲在Memory數據表裡的數據使用的是長度不變的格式,這意味著不能使用BLOB和TEXT這樣的長度可變的數據類型,VARCHAR是一種長度可變的類型,但因為它在MySQL內部當做長度固定不變的CHAR類型,所以可以使用。
一般在以下幾種情況下使用Memory存儲引擎:
1.目標數據較小,而且被非常頻繁地訪問。在內存中存放數據,所以會造成內存的使用,可以通過參數max_heap_table_size控制Memory表的大小,設置此參數,就可以限制Memory表的最大大小。
2.如果數據是臨時的,而且要求必須立即可用,那麼就可以存放在內存表中。
3.存儲在Memory表中的數據如果突然丟失,不會對應用服務產生實質的負面影響。
Memory同時支持散列索引和B樹索引。B樹索引的優於散列索引的是,可以使用部分查詢和通配查詢,也可以使用<、>和>=等操作符方便數據挖掘。散列索引進行「相等比較」非常快,但是對「范圍比較」的速度就慢多了,因此散列索引值適合使用在=和<>的操作符中,不適合在<或>操作符中,也同樣不適合用在order by子句中。
可以在表創建時利用USING子句指定要使用的版本。例如:
復制代碼代碼如下:
create table users
(
id smallint unsigned not null auto_increment,
username varchar(15) not null,
pwd varchar(15) not null,
index using hash (username),
primary key (id)
)engine=memory;
上述代碼創建了一個表,在username欄位上使用了HASH散列索引。下面的代碼就創建一個表,使用BTREE索引。
復制代碼代碼如下:
create table users
(
id smallint unsigned not null auto_increment,
username varchar(15) not null,
pwd varchar(15) not null,
index using btree (username),
primary key (id)
)engine=memory;
MERGE
MERGE存儲引擎是一組MyISAM表的組合,這些MyISAM表結構必須完全相同,盡管其使用不如其它引擎突出,但是在某些情況下非常有用。說白了,Merge表就是幾個相同MyISAM表的聚合器;Merge表中並沒有數據,對Merge類型的表可以進行查詢、更新、刪除操作,這些操作實際上是對內部的MyISAM表進行操作。Merge存儲引擎的使用場景。
對於伺服器日誌這種信息,一般常用的存儲策略是將數據分成很多表,每個名稱與特定的時間端相關。例如:可以用12個相同的表來存儲伺服器日誌數據,每個表用對應各個月份的名字來命名。當有必要基於所有12個日誌表的數據來生成報表,這意味著需要編寫並更新多表查詢,以反映這些表中的信息。與其編寫這些可能出現錯誤的查詢,不如將這些表合並起來使用一條查詢,之後再刪除Merge表,而不影響原來的數據,刪除Merge表只是刪除Merge表的定義,對內部的表沒有任何影響。
ARCHIVE
Archive是歸檔的意思,在歸檔之後很多的高級功能就不再支持了,僅僅支持最基本的插入和查詢兩種功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以後的版本中就開始支持索引了。Archive擁有很好的壓縮機制,它使用zlib壓縮庫,在記錄被請求時會實時壓縮,所以它經常被用來當做倉庫使用。
存儲引擎的一些問題
1.如何查看伺服器有哪些存儲引擎可以使用?
為確定你的MySQL伺服器可以用哪些存儲引擎,執行如下命令:
復制代碼代碼如下:
show engines;
這個命令就能搞定了。
2.如何選擇合適的存儲引擎?
(1)選擇標准可以分為:
(2)是否需要支持事務;
(3)是否需要使用熱備;
(4)崩潰恢復:能否接受崩潰;
(5)是否需要外鍵支持;
然後按照標准,選擇對應的存儲引擎即可。
Ⅱ mysql 索引中的USING BTREE 是什麼意思
b-tree 是mysql 索引默認使用的數據結構,
自動建表語句會出現
UNIQUEKEY uq_network_domain USING BTREE (network_id,network_name,network_domain)
手動時不用理會
[CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,...)
[index_option] ...
當然你也可可以寫上
index_type:
USING {BTREE | HASH}
當然你如果不明白什麼是B-Tree花還是google 一下吧
Ⅲ mysql 索引有哪些各⽤用了了哪些數據結構
從數據結構角度
1、B+樹索引(O(log(n))):關於B+樹索引,可以參考 MySQL索引背後的數據結構及演算法原理
2、hash索引:
a 僅僅能滿足"=","IN"和"<=>"查詢,不能使用范圍查詢
b 其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的IO訪問,所以 Hash 索引的查詢效率要遠高於 B-Tree 索引
c 只有Memory存儲引擎顯示支持hash索引
3、FULLTEXT索引(現在MyISAM和InnoDB引擎都支持了)
4、R-Tree索引(用於對GIS數據類型創建SPATIAL索引)
Ⅳ MySQL存儲引擎是什麼
MySQL有多種存儲引擎,每種存儲引擎有各自的優缺點,可以擇優選擇使用:
MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
Ⅳ 哪些存儲引擎支持b樹索引,哪些支持hash索引
對B樹的寫入過程是一次原位寫入的過程,主要分為兩個部分,首先是查找到對應的塊的位置,然後將新數據寫入到剛才查找到的數據塊中,然後再查找到塊所對應的磁碟物理位置,將數據寫入去。當然,在內存比較充足的時候,因為B樹的一部分可以被緩存在內存中,所以查找塊的過程有一定概率可以在內存內完成,不過為了表述清晰,我們就假定內存很小,只夠存一個B樹塊大小的數據吧。可以看到,在上面的模式中,需要兩次隨機尋道(一次查找,一次原位寫),才能夠完成一次數據的寫入,代價還是很高的。
通常也常見於其他存儲引擎的查找速度優化上。 Hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的IO訪問,所以 Hash 索引的查詢效率要遠高於 B-Tree 索引。雖然 Hash 索引效率高,但是 Hash 索引本身由於其特殊性也帶來了很多限制和弊端,代表資料庫:redis、memcache等
Ⅵ MySQL有哪些索引類型
主要有這些:
PRIMARY, INDEX, UNIQUE 這3種是一類
PRIMARY 主鍵。 就是 唯一 且 不能為空。
INDEX 索引,普通的
UNIQUE 唯一索引。 不允許有重復。
FULLTEXT 是全文索引,用於在一篇文章中,檢索文本信息的。
Ⅶ mysql存儲引擎類型有哪些
1、MyISAM
使用這個存儲引擎,每個MyISAM在磁碟上存儲成三個文件。
(1)frm文件:存儲表的定義數據
(2)MYD文件:存放表具體記錄的數據
(3)MYI文件:存儲索引
frm和MYI可以存放在不同的目錄下。MYI文件用來存儲索引,但僅保存記錄所在頁的指針,索引的結構是B+樹結構。下面這張圖就是MYI文件保存的機制:
從這張圖可以發現,這個存儲引擎通過MYI的B+樹結構來查找記錄頁,再根據記錄頁查找記錄。並且支持全文索引、B樹索引和數據壓縮。
支持數據的類型也有三種:
(1)靜態固定長度表
這種方式的優點在於存儲速度非常快,容易發生緩存,而且表發生損壞後也容易修復。缺點是占空間。這也是默認的存儲格式。
(2)動態可變長表
優點是節省空間,但是一旦出錯恢復起來比較麻煩。
(3)壓縮表
上面說到支持數據壓縮,說明肯定也支持這個格式。在數據文件發生錯誤時候,可以使用check table工具來檢查,而且還可以使用repair table工具來恢復。
有一個重要的特點那就是不支持事務,但是這也意味著他的存儲速度更快,如果你的讀寫操作允許有錯誤數據的話,只是追求速度,可以選擇這個存儲引擎。
2、InnoDB
InnoDB是默認的資料庫存儲引擎,他的主要特點有:
(1)可以通過自動增長列,方法是auto_increment。
(2)支持事務。默認的事務隔離級別為可重復度,通過MVCC(並發版本控制)來實現的。
(3)使用的鎖粒度為行級鎖,可以支持更高的並發;
(4)支持外鍵約束;外鍵約束其實降低了表的查詢速度,但是增加了表之間的耦合度。
(5)配合一些熱備工具可以支持在線熱備份;
(6)在InnoDB中存在著緩沖管理,通過緩沖池,將索引和數據全部緩存起來,加快查詢的速度;
(7)對於InnoDB類型的表,其數據的物理組織形式是聚簇表。所有的數據按照主鍵來組織。數據和索引放在一塊,都位於B+數的葉子節點上;
當然InnoDB的存儲表和索引也有下面兩種形式:
(1)使用共享表空間存儲:所有的表和索引存放在同一個表空間中。
(2)使用多表空間存儲:表結構放在frm文件,數據和索引放在IBD文件中。分區表的話,每個分區對應單獨的IBD文件,分區表的定義可以查看我的其他文章。使用分區表的好處在於提升查詢效率。
對於InnoDB來說,最大的特點在於支持事務。但是這是以損失效率來換取的。
3、Memory
將數據存在內存,為了提高數據的訪問速度,每一個表實際上和一個磁碟文件關聯。文件是frm。
(1)支持的數據類型有限制,比如:不支持TEXT和BLOB類型,對於字元串類型的數據,只支持固定長度的行,VARCHAR會被自動存儲為CHAR類型;
(2)支持的鎖粒度為表級鎖。所以,在訪問量比較大時,表級鎖會成為MEMORY存儲引擎的瓶頸;
(3)由於數據是存放在內存中,一旦伺服器出現故障,數據都會丟失;
(4)查詢的時候,如果有用到臨時表,而且臨時表中有BLOB,TEXT類型的欄位,那麼這個臨時表就會轉化為MyISAM類型的表,性能會急劇降低;
(5)默認使用hash索引。
(6)如果一個內部表很大,會轉化為磁碟表。
在這里只是給出3個常見的存儲引擎。使用哪一種引擎需要靈活選擇,一個資料庫中多個表可以使用不同引擎以滿足各種性能和實際需求,使用合適的存儲引擎,將會提高整個資料庫的性能
Ⅷ mysql中myisam,innodb和memory三個存儲引擎的區別
1、區別:
1) MyISAM管理非事務表。提供高速存儲和檢索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,是默認的存儲引擎,除非配置MySQL默認使用另外一個引擎。
2)MEMORY存儲引擎提供「內存中」表。MERGE存儲引擎允許集合將被處理同樣的MyISAM表作為一個單獨的表。就像MyISAM一樣,MEMORY和MERGE存儲引擎處理非事務表,這兩個引擎也都被默認包含在MySQL中。
注釋:MEMORY存儲引擎正式地被確定為HEAP引擎。
3)InnoDB和存儲引擎提供事務安全表,默認被包括在所 有MySQL 5.1二進制分發版里,可以按照喜好通過配置MySQL來允許或禁止任一引擎。
2、功能點簡介
1)MyISAM存儲引擎
MyISAM存儲引擎不支持事務,不支持行級鎖,只支持並發插入的表鎖,主要用於高負載的select。
myisam類型的表支持三種不同的存儲結構:靜態型、動態型、壓縮型。
(1)靜態型:就是定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的數據類型),這樣mysql就會自動使用靜態myisam格式。
使用靜態格式的表的性能比較高,因為在維護和訪問的時候以預定格式存儲數據時需要的開銷很低。但是這高性能是有空間換來的,因為在定義的時候是固定的,所以不管列中的值有多大,都會以最大值為准,占據了整個空間。
(2)動態型:如果列(即使只有一列)定義為動態的(xblob, xtext, varchar等數據類型),這時myisam就自動使用動態型,雖然動態型的表佔用了比靜態型表較少的空間,但帶來了性能的降低,因為如果某個欄位的內容發生改變則其位置很可能需要移動,這樣就會導致碎片的產生。隨著數據變化的怎多,碎片就會增加,數據訪問性能就會相應的降低。
(3)壓縮型:如果在這個資料庫中創建的是在整個生命周期內只讀的表,則這種情況就是用myisam的壓縮型表來減少空間的佔用。
2)MEMORY存儲引擎:
(1)memory存儲引擎相比前面的一些存儲引擎,有點不一樣,其使用存儲在內從中的數據來創建表,而且所有的數據也都存儲在內存中。
(2)每個基於memory存儲引擎的表實際對應一個磁碟文件,該文件的文件名和表名是相同的,類型為.frm。該文件只存儲表的結構,而其數據文件,都是存儲在內存中,這樣有利於對數據的快速處理,提高整個表的處理能力。
(3)memory存儲引擎默認使用哈希(HASH)索引,其速度比使用B-+Tree型要快,如果讀者希望使用B樹型,則在創建的時候可以引用。
(4)memory存儲引擎文件數據都存儲在內存中,如果mysqld進程發生異常,重啟或關閉機器這些數據都會消失。所以memory存儲引擎中的表的生命周期很短,一般只使用一次。
3)innoDB存儲引擎:
(1) innodb存儲引擎該mysql表提供了事務,回滾以及系統崩潰修復能力和多版本迸發控制的事務的安全。
(2)innodb支持自增長列(auto_increment),自增長列的值不能為空,如果在使用的時候為空的話怎會進行自動存現有的值開始增值,如果有但是比現在的還大,則就保存這個值。
(3)innodb存儲引擎支持外鍵(foreign key) ,外鍵所在的表稱為子表而所依賴的表稱為父表。
(4)innodb存儲引擎最重要的是支持事務,以及事務相關聯功能。
(5)innodb存儲引擎支持mvcc的行級鎖。
Ⅸ mysql innodb 有哪些索引類型
1、B+樹索引(O(log(n))):關於B+樹索引,可以參考 MySQL索引背後的數據結構及演算法原理
2、hash索引:
a 僅僅能滿足"=","IN"和"<=>"查詢,不能使用范圍查詢
b 其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的IO訪問,所以 Hash 索引的查詢效率要遠高於 B-Tree 索引
c 只有Memory存儲引擎顯示支持hash索引
3、FULLTEXT索引(現在MyISAM和InnoDB引擎都支持了)
4、R-Tree索引(用於對GIS數據類型創建SPATIAL索引)