本文用于记录苦啃《高性能MySQL(第3版)》后,个人认为有价值的笔记,核心内容均围绕标题展开。既做一个学习的记录,同时也做一个沟通交流,欢迎各位大佬互动~
MySQL逻辑架构
分层架构:上层是服务器层的服务和查询执行引擎(核心功能:查询解析、分析、优化、缓存以及内置函数(日期,时间,加密函数和数学函数)),下层是存储引擎(数据的提取和存储)。
服务器通过API与存储引擎进行通信。
连接管理与安全性
连接管理:每个客户端连接都会在服务器进程中拥有一个线程,这个连接中的查询只会再这个线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。
安全性:客户端(应用)连接数据库时,服务器需要对其进行验证(基于用户名,原始主机信息和密码)。 此外,连接成功还会进一步验证客户端是否具有特定的查询权限。
优化与执行
MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化(包括:重写查询、决定表的读取顺序,以及选择合适的索引)。以上过程可以通过关键字提示(hint)优化器,也可以请求优化器解释(explain)优化过程的各个因素。
优化器不关心表使用的执行引擎,但存储引擎对于优化查询是有影响的(例:某种引擎的索引,对特定的查询有优化)。
对于SELECT语句,解析查询前,服务器会检查缓存,看是否可以不再执行解析查询相关操作。
并发控制
读写锁
读锁,共享锁,互不阻塞,多个客户同一时刻读取同一资源,互不干扰。
写锁,排他锁,相互阻塞,一个写锁会阻塞其他写锁和读锁。
锁粒度
锁策略,解决锁的开销(锁操作:获得,检查解除,释放)和数据安全性之间的平衡问题。
表锁:锁定整张表,会阻塞其他用户对该表的读写操作。
行级锁:最大成都支持并发处理,但是增加了锁的开销。存储引擎层实现。
事务
事务,一组原子性的SQL查询,一个独立的工作单元。
特性:ACID
Atomicity,原子性。事务是最小的工作单元,所有操作要么全部提交成功,要么全部失败回滚。
Consistency,一致性。数据库总是从一个一致性状态转换到另一个一致性状态。
Isolation,隔离性。事务在未提交之前,对于其他事务是不可兼得。
Durability,持久性。事务一旦提交,所作操作就会被永久保存到数据库。
隔离级别
READ UNCOMMITTED,未提交读。事务的修改未提交,其他事务也可见。
READ COMMITTED,提交读/不可重复读。事务只能看见已提交事务所做的修改。但两次执行同样的查询,可能会得到不一样的结果。
REPEATABLE READ,可重复读。可以保证两次同样的查询,读取到同样的记录结果。但是无法解决幻读(读取某个范围的记录时,另外的事务对范围内插入新的记录),在此读取时会产生幻行。MySQL默认事务隔离级别。
SERIALIZABLE,可串行化。强制事务串行执行,解决幻读的问题。在读取的每一行都加锁,这会导致大量的超时以及锁争用的问题。
死锁
事务以不同顺序锁定资源,互相占用,导致恶行循环的现象。
可以通过死锁检测以及死锁超时机制(InooDB解决死锁的方法,将持有最少行级排他锁的事务进行回滚)
事务日志
事务日志可以提高事务效率。
使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为持久到硬盘的事务日志。
由于事务日志采用的是追加的方式,在磁盘上是顺序I/O,速度较快。不像数据修改,随机I/O需要在磁盘多个地方移动磁头,效率更高。事务日志持久化后,内存中被修改的数据在后台可以慢慢地刷回磁盘——预写式日志。
MySQL中的事务
自动提交(AUTOCOMMIT)。
在事务中混用存储引擎。如果混合使用事务型和非事务型表,在需要回滚时,非事务型的表就无法撤销。
多版本并发控制MVCC
MVCC时行级锁的一个变种,避免了加锁操作,开销更低。
InonoDB的MVCC实现原理:
MySQL中的存储引擎
InnoDB存储引擎
支持事务和行级锁
采用MVCC来支持高并发,默认隔离级别:RR可重复读,通过间隙锁策略防止幻读。
基于聚簇索引简历,对主键查询有很高性能
支持热备份
MyISAM存储引擎
不支持事务和行级锁
其他引擎