MySQL存儲引擎概覽

查看mysql版本

mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.32-log |
+------------+
1 row in set (0.00 sec)

或者:

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.6.32, for Win32 (AMD64)

Connection id:          9
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.6.32-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    gbk
Conn.  characterset:    gbk
TCP port:               3307
Uptime:                 4 hours 7 min 11 sec

Threads: 4  Questions: 126  Slow queries: 0  Opens: 73  Flush tables: 1  Open tables: 66  Queries per second avg: 0.008

查看MySQL存儲引擎

show engines
Engine Support Comment Transactions XA Savepoints
MyISAM YES MyISAM storage engine NO NO NO
MRG_MYISAM YES Collection of identical MyISAM tables NO NO NO
CSV YES CSV storage engine NO NO NO
BLACKHOLE YES /dev/null storage engine (anything you write to it disappears) NO NO NO
MEMORY YES Hash based, stored in memory, useful for temporary tables NO NO NO
FEDERATED NO Federated MySQL storage engine (NULL) (NULL) (NULL)
ARCHIVE YES Archive storage engine NO NO NO
InnoDB DEFAULT Supports transactions, row-level locking, and foreign keys YES YES YES
PERFORMANCE_SCHEMA YES Performance Schema NO NO NO

Support:DEFAULT表示MYSQL數據庫默認的存儲引擎,其它存儲引擎就是你能夠選擇的。
如上表,InnoDB是默認的存儲引擎mysql

存儲引擎中InnoDB與Myisam的主要區別

1. 事務處理

innodb支持事務功能,myisam 不支持。
Myisam的執行速度更快,性能更好。sql

2. select ,update,insert ,delete 操做

MyISAM:若是執行大量的SELECT,MyISAM是更好的選擇
InnoDB:若是你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表數據庫

3. 鎖機制不一樣

InnoDB 爲行級鎖,myisam爲表級鎖。
注意:當數據庫沒法肯定,所找的行時,也會變爲鎖定整個表。
如: update table set num = 10 where username like "%test%";緩存

4. 查詢表的行數不一樣

select count(*) fromtable

MyISAM : MyISAM只要簡單的讀出保存好的行數,注意的是,當count(*)語句包含 where條件時,兩種表的操做是同樣的
InnoDB : InnoDB中不保存表的具體行數,也就是說,執行 select count(*) fromtable 時,InnoDB要掃描一遍整個表來計算有多少行併發

5. 物理結構不一樣

MyISAM :每一個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。app

  • .frm文件存儲表定義。
  • 數據文件的擴展名爲.MYD (MYData)。
  • 索引文件的擴展名是.MYI(MYIndex)

InnoDB:基於磁盤的資源是InnoDB表空間數據文件和它的日誌文件,InnoDB 表的大小隻受限於操做系統文件的大小,通常爲2GBide

6. anto_increment機制不一樣

更好和更快的auto_increment處理性能

其餘:爲何MyISAM會比Innodb的查詢速度快。

Innodb在作SELECT的時候,要維護的東西比MYISAM引擎多不少;操作系統

  • 數據塊,Innodb要緩存,MYISAM只緩存索引塊, 這中間還有換進換出的減小;
  • Innodb尋址要映射到塊,再到行,MYISAM記錄的直接是文件的OFFSET,定位比Innodb要快
  • Innodb還須要維護MVCC一致;雖然你的場景沒有,但他仍是須要去檢查和維護

MVCC (Multi-Version Concurrency Control)多版本併發控制 日誌

InnoDB:經過爲每一行記錄添加兩個額外的隱藏的值來實現MVCC,這兩個值一個記錄這行數據什麼時候被建立,另一個記錄這行數據什麼時候過時(或者被刪除)。可是InnoDB並不存儲這些事件發生時的實際時間,相反它只存儲這些事件發生時的系統版本號。這是一個隨着事務的建立而不斷增加的數字。每一個事務在事務開始時會記錄它本身的系統版本號。每一個查詢必須去檢查每行數據的版本號與事務的版本號是否相同。讓咱們來看看當隔離級別是REPEATABLEREAD時這種策略是如何應用到特定的操做的:

SELECT InnoDB必須每行數據來保證它符合兩個條件:   一、InnoDB必須找到一個行的版本,它至少要和事務的版本同樣老(也即它的版本號不大於事務的版本號)。這保證了無論是事務開始以前,或者事務建立時,或者修改了這行數據的時候,這行數據是存在的。   二、這行數據的刪除版本必須是未定義的或者比事務版本要大。這能夠保證在事務開始以前這行數據沒有被刪除。

相關文章
相關標籤/搜索