连接池 与用户请求建立连接
核心功能层 查询解析,分析,优化,内置函数,跨存储引擎的功能
存储引擎层 数据的存入和提取
mysql的发送默认为明文,可以使用ssl加密数据
parser 词法,语法,语意分析,优化
explain 分析工具
query cache 缓存,只保存select查询
并发访问控制:基于锁来实现
MySQL锁:
执行操作时施加的锁的模式
读锁:用户在读的时候施加的锁,为防止别人修改,但是用户可以读,还被称为共享锁
写锁:独占锁,排它锁。其他用户不能读,不能写
锁粒度:
表锁:table lock
锁定了整张表
行锁:row lock
锁定了需要的行
粒度越小,开销越大,但并发性越好:
粒度越大,开销越小,但并非性越差;
锁的实现位置:
MySQL锁 可以手动使用,可以使用显示锁
存储引擎锁 自动进行的(隐式锁)
显示锁:
LOCK TABLES t1 READ; 施加读锁
LOCK TABLES t1 WRITE; 施加写锁
UNLOCK TABLES; 解锁
SHOW OPEN TABLES WHERE In_use > 0; 查看那些表被锁定
InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁)
select .... lock in share mode
select .... for update
SHOW TABLE STATUS LIKE 't1'\G
SELECT * FROM t1 WHERE ID <=3 LOCK IN SHARE MODE;
做备份时要手动施加读锁
事务:Transaction
事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元
ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务
A:Atomicity 原子性,都执行或者都不执行
C:Consistency 一致性,从一个一致性状态转到另外一个一致性状态
I:Isolaction 隔离性。一个事务的所有修改操作在提交前对其他事务时不可见的
D: Durability 持久性,一旦事务得到提交,其所做的修改会永久有效
安全性越高,并发性越低
隔离级别:
READ UNCOMMITTEND (读未提交),脏读,不可重复读,幻读
READ COMMITTEND (读提交)
REPEATABLE READ (可重读)
SERIALIZABLE (可串行化)强制事务的串行执行避免了幻读;性能极低
START TRANSACTION; 启动事务( MyISAM不支持事务)
COMMIT; 事务提交
ROLLBACK 事务回滚(全部回滚)
SAVEPOINT identifier 创建回滚点
ROLLBACK TO identifier 事务回滚(回滚到某个点)
mysql事务默认自动提交,对手动显示启动事务不会影响。
如何没有显式启动事务,每个语句都会当作一个默认的事务,其执行完成会被自动提交
可通过如下方式关闭自动提交。
SHOW GLOBAL VARIABLES LIKE '%commit%';
select @@global.autocommit
set global autocommit = 0
注意 关闭自动提交,请记得手动启动事务,应记得手动提交
查看mysql的事务隔离级别
show global variables like '%iso%'
select @@global.tx_isolation
建议:对事物要求不特别严格的场景下,可以使用读提交
MVCC:多版本并发控制
每个事务启动时,InnoDB会为每个启动的事务提供一个当下时刻的快照
为实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间
里面存储的系统版本号
MVCC只在两个隔离级别下有效:read committed和repeatable read