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)