mysql引擎 區別

一、先看看mysql當前默認存儲引擎mysql

mysql> show variables like '%storage_engine%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_disk_storage_engine | InnoDB |
| internal_tmp_mem_storage_engine | TempTable |
+----------------------------------+-----------+
5 rows in set (0.11 sec)
二、查看mysql有哪些引擎sql

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
mysql支持存儲引擎有好幾種,我們這裏主要討論一下經常使用的幾種存儲引擎。Innodb,myisam數據庫

索引是 MySQL數據庫很重要的一部分,它對數據表查詢性能的好壞起着決定性的做用,尤爲是對大表做用更加明顯。 做爲索引中最爲常見的一種類型,B-Tree索引大都採用的是 B+Tree數據結構來存儲數據(NDB集羣存儲引擎內部實際上採用 T-Tree結構存儲這種索引)。B-Tree一般也意味着全部的值都是按順序存儲的。 大多數的 MySQL引擎都支持這種索引,而不一樣的存儲引擎以不一樣的方式來實現 B-Tree索引,性能方面各有優劣。數據結構

INNODB
INNODB索引實現
與 MyISAM相同的一點是,InnoDB 也採用 B+Tree這種數據結構來實現 B-Tree索引。而很大的區別在於,InnoDB 存儲引擎採用「彙集索引」的數據存儲方式實現B-Tree索引,所謂「彙集」,就是指數據行和相鄰的鍵值緊湊地存儲在一塊兒,注意 InnoDB 只能彙集一個葉子頁(16K)的記錄(即彙集索引知足必定的範圍的記錄),所以包含相鄰鍵值的記錄可能會相距甚遠。併發

在 InnoDB 中,表被稱爲 索引組織表(index organized table),InnoDB 按照主鍵構造一顆 B+Tree (若是沒有主鍵,則會選擇一個惟一的而且非空索引替代,若是沒有這樣的索引,InnoDB則會隱式地定義一個主鍵來做爲彙集索引),同時葉子頁中存放整張表的行記錄數據,也能夠將彙集索引的葉子節點稱爲數據頁,非葉子頁能夠看作是葉子頁的稀疏索引。app

下圖說明了 InnoDB彙集索引的實現方式,同時也體現了一張 innoDB表的結構,能夠看到,InnoDB 中,主鍵索引和數據是一體的,沒有分開。: ide



這種實現方式,給予了 InnoDB 按主鍵檢索的超高性能。能夠有目的性地選擇彙集索引,好比一個郵件表,能夠選擇用戶ID來彙集數據,這樣只須要從磁盤讀取較少而且連續的數據頁就能得到某個id的用戶所有的郵件,避免了讀取分散頁時所耗費的隨機I/O。高併發

InnoDB 則是 I/O 操做,Innodb讀寫採用MVCC來支持高併發。性能

全表掃描:
當InnoDB作全表掃描時並不高效,由於 InnoDB 實際上並無順序讀取,在大多狀況下是在隨機讀取。作全表掃描時,InnoDB 會按主鍵順序掃描頁面和行。這應用於全部的InnoDB 表,包括碎片化的表。若是主鍵頁表沒有碎片(存儲主鍵和行的頁表),全表掃描是至關快,由於讀取順序接近物理存儲順序。可是當主鍵頁有碎片時,該掃描就會變得十分緩慢指針

行級鎖
提供行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non-locking read in SELECTs),另外,InnoDB表的行鎖也不是絕對的,若是在執行一個SQL語句時MySQL不能肯定要掃描的範圍,InnoDB表一樣會鎖全表,例如update table set num=1 where name like 「%aaa%」

MYISAM
MyISAM索引的實現
每一個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。MyISAM索引文件【.MYI (MYIndex)】和數據文件【.MYD (MYData)】是分離的,索引文件僅保存記錄所在頁的指針(物理位置),經過這些地址來讀取頁,進而讀取被索引的行。先來看看結構圖

上圖很好地說明了樹中葉子保存的是對應行的物理位置。經過該值,存儲引擎能順利地進行回表查詢,獲得一行完整記錄。同時,每一個葉子頁也保存了指向下一個葉子頁的指針。從而方便葉子節點的範圍遍歷。 而對於二級索引,在 MyISAM存儲引擎中以與上圖一樣的方式實現,這也說明了 MyISAM的索引方式是「非彙集的」,與 Innodb的「彙集索引」造成了對比

MyISAM 默認會把索引讀入內存,直接在內存中操做;

表級鎖
小結:Innodb強調多功能性,支持的拓展功能比較多,myisam主要側重於性能

區別InnoDB支持事務,MyISAM不支持,對於InnoDB每一條SQL語言都默認封裝成事務,自動提交,這樣會影響速度,因此最好把多條SQL語言放在begin和commit之間,組成一個事務;InnoDB是彙集索引,數據文件是和索引綁在一塊兒的,必需要有主鍵,經過主鍵索引效率很高。可是輔助索引須要兩次查詢,先查詢到主鍵,而後再經過主鍵查詢到數據。所以,主鍵不該該過大,由於主鍵太大,其餘索引也都會很大。而MyISAM是非彙集索引,數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。InnoDB不保存表的具體行數,執行select count(*) from table時須要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只須要讀出該變量便可,速度很快;Innodb不支持全文索引,而MyISAM支持全文索引,查詢效率上MyISAM要高;如何選擇是否要支持事務,若是要請選擇innodb,若是不須要能夠考慮MyISAM;若是表中絕大多數都只是讀查詢,能夠考慮MyISAM,若是既有讀寫也挺頻繁,請使用InnoDB。系統奔潰後,MyISAM恢復起來更困難,可否接受;MySQL5.5版本開始Innodb已經成爲Mysql的默認引擎(以前是MyISAM),說明其優點是有目共睹的,若是你不知道用什麼,那就用InnoDB,至少不會差。

相關文章
相關標籤/搜索