目录
本篇是系列性,由浅入深,主要是为了本人日后回看时再学习,如果道友对Mysql也是零基础的话,强烈建议从头开始看
Mysql的存储引擎
表类型:
CREATE TABLE ... ENGINE=
InnoDB:
处理大量的短期事务:
数据存储于“表空间”(table space)中;
1) 所有InnoDB表的数据和索引放置于同一个表空间中;
表空间文件:datadir定义的目录下;
数据文件:ibddata1,ibddata2,…
2) 每个表单独使用一个表空间存储表的数据和索引;
innodb_file_per_table=ON
数据文件(存储数据和索引):tb1_name.ibd,
表格式定义:tb1_name.frm
基于MVCC来支持高并发,支持所有的四个隔离级别,默认级别为REPEATABLE READ,间隙锁防止幻读;
使用聚集索引
支持“自适应hash索引”
锁粒度:行级锁
MariaDB(XtraDB (percona))
数据存储:表空间
并发:MVCC,间隙锁
索引:聚集索引、辅助索引
性能:预计操作、自适应hash、插入缓存区
备份:支持热备(xtrabaup)
MyISAM:
支持全文索引(FULLTEXT index)、压缩、空间函数(GIS);但不支持事务,且为表级锁;崩溃后无法恢复;
适用场景:只读(或者写较少)、表较小(可以接受长时间进行修复操作)
Aria:crash-safe
文件:
tb1_name.frm:表格式定义
tb1_name.MYD:数据文件
tb1_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) LOCAK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ...
lock_type:
READ [LOCAL] | [LOW_PRIORITY] WRITE
UNLOCK TABLES
2) FLUSH TABLES tb_name[,...] [WITH READ LOCK] [FOR UPDATE]
3) SELECT clase [FOR UPDATE] [WITH READ LOACK]
分类:
隐式锁:由存储引擎自动施加锁;
显示锁:
Mysql事务:
事务:一组原子性的SQL查询,或者说一个独立工作单元。
事务日志:
ACID测试:
A:atomicity,原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚;
C:consistency,一致性;数据库总是从一个一致性状态转换为另一个一致性状态;
I:Isolation,隔离性;一个事物所做出的操作在提交之前,是不能为其它所见;隔离有多种隔离级别;
D:durability:持久性,一旦事务提交,其所做的修改会永久保存于数据库中;
事务:
启动事务:START TRANSACTION
…
结束事务:
1) COMMIT:提交
2) ROLLBACK:回滚
注意:只有事务型存储引擎方能支持此操作;
建议:显示请求和提交事务,而不要使用自动提交功能:
autocommit={1|0}
事务支持savepoint
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
事务隔离级别:
READ UNCOMMITTED (读未提交)
READ COMMITTED (读提交)
REPEATABLE READ (可重读)
SERIALIZABILE (可串行化)
可能存在问题:
脏读;
不可重复读;
幻读;
加锁读;
tx_isolation:服务器变量,默认为REPEATABLE-READ;可在SESSION级进行修改;
SET tx_isolation=''
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
MVCC: 多版本并发控制
死锁:
两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态;
事务日志:
事务日志的写入类型为追加,因此其操作为“顺序IO”;此日志通常也被称为“预写式日志”;