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是默認的存儲引擎

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

1. 事務處理

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

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在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。

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

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

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必須每行數據來保證它符合兩個條件:
  1、InnoDB必須找到一個行的版本,它至少要和事務的版本一樣老(也即它的版本號不大於事務的版本號)。這保證了不管是事務開始之前,或者事務創建時,或者修改了這行數據的時候,這行數據是存在的。
  2、這行數據的刪除版本必須是未定義的或者比事務版本要大。這可以保證在事務開始之前這行數據沒有被刪除。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章