1. 程式人生 > 其它 >mysql資料庫引擎_MySQL資料庫引擎

mysql資料庫引擎_MySQL資料庫引擎

技術標籤:mysql資料庫引擎

一、儲存引擎概念

MySQL中的資料用各種不同的技術儲存在檔案(或者記憶體)中。這些技術中的每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。

二、有哪些儲存引擎呢?

儲存引擎主要有:

1.InnoDB 2.Mrg_Myisam 3.Memory4.Blackhole 5.MyIsam 6.CVS 7.Archive 8.Performance_Schema 9.Federated

mysql>show engines\G*************************** 1. row ***************************Engine: InnoDB

Support: DEFAULT

Comment: Supports transactions, row-level locking, andforeign keys

Transactions: YES

XA: YES

Savepoints: YES*************************** 2. row ***************************Engine: MRG_MYISAM

Support: YES

Comment: Collection of identical MyISAM tables

Transactions: NO

XA: NO

Savepoints: NO*************************** 3. row ***************************Engine: MEMORY

Support: YES

Comment: Hash based, storedin memory, useful fortemporary tables

Transactions: NO

XA: NO

Savepoints: NO*************************** 4. row ***************************Engine: BLACKHOLE

Support: YES

Comment:/dev/null storage engine (anything you write to it disappears)

Transactions: NO

XA: NO

Savepoints: NO*************************** 5. row ***************************Engine: MyISAM

Support: YES

Comment: MyISAM storage engine

Transactions: NO

XA: NO

Savepoints: NO*************************** 6. row ***************************Engine: CSV

Support: YES

Comment: CSV storage engine

Transactions: NO

XA: NO

Savepoints: NO*************************** 7. row ***************************Engine: ARCHIVE

Support: YES

Comment: Archive storage engine

Transactions: NO

XA: NO

Savepoints: NO*************************** 8. row ***************************Engine: PERFORMANCE_SCHEMA

Support: YES

Comment: Performance Schema

Transactions: NO

XA: NO

Savepoints: NO*************************** 9. row ***************************Engine: FEDERATED

Support: NO

Comment: Federated MySQL storage engine

Transactions: NULL

XA: NULL

Savepoints: NULL9 rows in set (0.00 sec)

三、儲存引擎的主要特性

1.InnoDB

InnoDB是一個事務型的儲存引擎,有行及鎖定和外來鍵約束,適用於一下的場合:

1.更新多的表,適合處理多重併發的更新請求

2.支援事務

3.可以從災難中恢復(通過bin-log日誌等)

4.外來鍵約束。只有他支援外來鍵

5.支援自動增加列屬性auto_increment

2.Mrg_Myisam

Merge儲存引擎,是一組myIsam的組合,也就是說,他將MyIsam引擎的多個表聚合起來,但是他的內部沒有資料,

真正的資料依然是MyIsam引擎的表中,但是可以直接進行查詢、刪除更新等操作。

比如:我們可能會遇到這樣的問題,同一種類的資料會根據資料的時間分為多個表,

如果這時候進行查詢的話,就會比較麻煩,Merge可以直接將多個表聚合成一個表統一查詢,然後再刪除Merge表(刪除的是定義),原來的資料不會影響。

3.Memory

Memory採用的邏輯介質是記憶體,響應速度應該是很快的,但是當mysqld守護程序崩潰的時候資料會丟失,另外,要求儲存的資料是資料長度不變的格式,

比如,Blob和Text型別的資料不可用(長度不固定的)。

使用Memory儲存引擎情況:

1. 目標資料比較小,而且非常頻繁的進行訪問,在記憶體中存放資料,如果太大的資料會造成記憶體溢位。

可以通過引數max_heap_table_size控制Memory表的大小,限制Memory表的最大的大小。

2. 如果資料是臨時的,而且必須立即可用得到,那麼就可以放在記憶體中。

3. 儲存在Memory表中的資料如果突然間丟失的話也沒有太大的關係。

【注】 Memory同時支援雜湊索引和B樹索引,B樹索引可以使用部分查詢和通配查詢,也可以使用和>=等操作符方便資料探勘,

雜湊索引相等的比較快但是對於範圍的比較慢很多。

4.Blackhole

“黑洞”儲存引擎,他會丟棄所有的插入的資料,伺服器會記錄下Blackhole表的日誌,所以可以用於複製資料到備份資料庫。

看其他的一些資料說:可以用來充當dummy master,利用blackHole充當一個“dummy master”來減輕master的負載,

對於master來說“dummy master” 還是一個slave的角色,還有充當日誌伺服器等等。

5.MyIsam

MyIsam 儲存引擎獨立於作業系統,也就是可以在windows上使用,也可以比較簡單的將資料轉移到linux作業系統上去。

這種儲存引擎在建立表的時候,會建立三個檔案,一個是.frm檔案用於儲存表的定義,一個是.MYD檔案用於儲存表的資料,另一個是.MYI檔案,儲存的是索引。

作業系統對大檔案的操作是比較慢的,這樣將表分為三個檔案,那麼.MYD這個檔案單獨來存放資料自然可以優化資料庫的查詢等操作。

1. 不支援事務,但是並不代表著有事務操作的專案不能用MyIsam儲存引擎,可以在service層進行根據自己的業務需求進行相應的控制。

2. 不支援外來鍵。

3. 查詢速度很快,如果資料庫insert和update的操作比較多的話比較適用。

4. 對錶進行加鎖。

6.CSV

可以將scv檔案作為MySql的表來使用,但是不支援索引。CSV引擎表所有的欄位都必須為非空的,建立的表有兩個一個是CSV檔案和CSM檔案。

7.Archive

archive是歸檔的意思,僅僅支援插入和查詢兩種功能,在MySQL5.5以後支援索引功能,他擁有很好的壓縮機制,使用zlib壓縮庫,

在記錄請求的時候實時的進行壓縮,經常被用來作為倉庫使用。適合儲存大量的獨立的作為歷史記錄的資料。擁有很高的插入速度但是對查詢的支援較差。

8.Performance_Schema

MySQL5.5以後新增了一個儲存引擎,就是Performance_Schema,他主要是用來收集資料庫伺服器的效能引數。MySQL使用者不能建立儲存該型別的表。

他提供了以下的功能:

1. 提供程序等待的詳細資訊,包括鎖、互斥變數、檔案資訊。

2. 儲存歷史的事件彙總資訊,為Mysql伺服器的效能做出詳細的判斷。

3. 對於新增和刪除監控時間點都非常容易,並可以隨意的改變Mysql伺服器的監控週期

需要在配置檔案my.cnf中進行配置才能開啟。

9.Federated

Federated儲存引擎是訪問MySQL伺服器的一個代理,儘管該引擎看起來提供了一個很好的跨伺服器的靈活性,但是經常帶來問題,預設是禁用的。

MyIsam和InnoDB例項比較

1.建立兩張表分別以MyIsam和InnoDB作為儲存引擎

createtabletestMyIsam(

->idintunsignedprimarykeyauto_increment,

->namevarchar(20)notnull

->)engine=myisam;

createtabletestInnoDB(

->idintunsignedprimarykeyauto_increment,

->namevarchar(20)notnull

->)engine=innodb;

兩張表內容是一致的但是儲存引擎不一樣

2.插入一百萬資料

這裡當然不能手動的插入,建立一個儲存過程插入一百萬的資料。

mysql>createprocedureinsertMyIsam()

->begin

->set@i=1;

->while@i<=1000000

->do

->insertintotestMyIsam(name)values(concat("wy",@i));

->set@i=@i+1;

->endwhile;

->end//

mysql>createprocedureinsertInnoDB()

->begin

->set@i=1;

->while@i<=1000000

->do

->insertintotestInnoDB(name)values(concat("wy",@i));

->set@i=@i+1;

->endwhile;

->end//

插入(一百萬條)MyIsam儲存引擎的表中的時間如下:

mysql>callinsertMyIsam;

->//

QueryOK,0rowsaffected(49.69sec)

插入(一百萬條)InnoDB儲存引擎的表中的時間如下:

mysql>callinsertInnoDB;

->//

QueryOK,0rowsaffected(1hour38min14.12sec)

這裡當時預設的是開啟了自動提交事務了,所以執行速度很慢,可以先將自動提交關閉,然後再呼叫儲存過程插入一百萬的資料,執行完成之後再開啟自動提交,這樣會快很多。

mysql>setautocommit=0;

QueryOK,0rowsaffected(0.00sec)

3.查詢資料總數目

下面是InnoDB的SQL語句的分析:

mysql>descselectcount(*)fromtestInnoDB\G;***************************1.row***************************id:1select_type:SIMPLE

table:testInnoDB

type:index

possible_keys:NULL

key:PRIMARY

key_len:4ref:NULL

rows:997134Extra:Usingindex1rowinset(0.03sec)

下面是MyIsam(他的資料總數儲存在其他的表中所以這裡是沒有影響行數的)的SQL語句的分析:

mysql>descselectcount(*)fromtestMyIsam\G;***************************1.row***************************id:1select_type:SIMPLE

table:NULL

type:NULL

possible_keys:NULL

key:NULL

key_len:NULL

ref:NULL

rows:NULL

Extra:Selecttablesoptimizedaway1rowinset(0.00sec)

4.查詢某一範圍的資料

沒有索引的列

mysql>select*fromtestMyIsamwherename>"wy100"andname

|id|name|

+-------+---------+

|1000|wy1000|

|10000|wy10000|

+-------+---------+

2rowsinset(0.43sec)

mysql>select*fromtestInnoDBwherename>"wy100"andname

|id|name|

+-------+---------+

|1000|wy1000|

|10000|wy10000|

+-------+---------+

有索引的列

對於使用MyIsam儲存引擎的表:

select * from testMyIsam where id > 10 and id < 999999;

執行時間:

999988rowsinset(0.91sec)

對於使用InnoDB儲存引擎的表:

select * from testInnoDB where id > 10 and id < 999999;

執行時間:

999988rowsinset(0.69sec)