MySQL存儲引擎:
表類型:
CREATE TABLE ... ENGINE=
InnoDB:
處理大量的短期事務;
數據存儲於“表空間(table space)”中;
(1) 所有InnoDB表的數據和索引放置於同一個表空間中;
表空間文件:datadir定義的目錄下
數據文件:ibddata1, ibddata2, ...
(2) 每個表單獨使用一個表空間存儲表的數據和索引;
innodb_file_per_table=ON #每表使用單獨的表空間,用來存儲數據,實現高級功能,實現單表備份
mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_file_%';
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| innodb_file_format | Antelope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | ON |
+--------------------------+----------+
4 rows in set (0.01 sec)
數據文件(存儲數據和索引):tbl_name.ibd,
表格式定義文件:tbl_name.frm
基於MVCC來支持高併發,支持所有的四個隔離級別,默認級別爲REPEATABLE READ; 間隙鎖防止幻讀;
innodb表使用聚集索引
innodb支持“自適應hash索引”
鎖粒度:行級鎖
MariaDB (XtraDB (percona))
數據存儲:表空間
併發:MVCC, 間隙鎖
索引:聚集索引、輔助索引
性能:預計操作、自適應hash、插入緩存區
備份:支持熱備(xtrabacup)
MyISAM:
支持全文索引(FULLTEXT index)、壓縮、空間函數(GIS); 但不支持事務,且爲表級鎖;
崩潰後無法安全恢復
適用場景:只讀(或者寫較少)、表較小(可以接受長時間進行修復操作)
Aria:crash-safe
文件:
tbl_name.frm: 表格式定義
tbl_name.MYD: 數據文件
tbl_name.MYI: 索引文件
特性:
加鎖和併發:表級鎖
修復:手工或自動修復、但可能丟失數據
索引:非聚集索引
延遲更新索引鍵:
壓縮表
行格式:dynamic, fixed, compressed, compact, redundent
其它的存儲引擎:
CSV:將普通的CSV(字段通過逗號分隔)作爲MySQL表使用;
MRG_MYISAM:將多個MyISAM表合併成爲一個虛擬表;
BLACKHOLE:類似於/dev/null,不真正存儲任何數據;
MEMORY:所有數據都保存於內存中,內存表;支持hash索引;表級鎖;
臨時表
PERFORMANCE_SCHEMA:僞存儲引擎;
ARCHIVE:只支持SELECT和INSERT操作;支持行級鎖和專用緩存區;
FEDERATED:用於訪問其它遠程MySQL服務器一個代理,它通過創建一個到遠程MySQL服務器的客戶端連接,並將查詢傳輸到遠程服務器執行,而後完成數據存取;
在MariaDB的上實現是FederatedX
MariaDB支持的其它存儲引擎:
OQGraph
SphinxSE
TokuDB
Cassandra
CONNECT
SQUENCE
併發控制:
鎖:
讀鎖:共享鎖
寫鎖:獨佔鎖
鎖粒度:
表級鎖
行級鎖
鎖策略:在鎖粒度及數據安全性尋求的平衡機制;
每種存儲引擎都可以自行實現其鎖策略和鎖粒度;
MySQL在服務器級也實現了鎖,表級鎖;用戶可顯式請求;
(1) LOCK TABLES
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...
mysql> LOCK TABLES students WRITE;
lock_type:
READ [LOCAL]
| [LOW_PRIORITY] WRITE
UNLOCK TABLES
mysql> UNLOCK TABLES;
(2) FLUSH TABLES tb_name[,...] [WITH READ LOCK] [FOR UPDATE]
(3) SELECT clase [FOR UPDATE] [WITH READ LOACK]
分類:
隱式鎖:由存儲引擎自動施加鎖;
顯式鎖: