高性能MYSQL(1)
一. MYSQL服务器逻辑架构
2942589459-59930ef93f276_articlex.png第一层负责连接管理、授权认证、安全等等。
每个客户端的连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名和密码的方式进行认证,也可以通过SSL证书进行认证。登录认证通过后,服务器还会验证该客户端是否有执行某个查询的权限。
第二层负责解析查询(编译SQL),并对其进行优化(如调整表的读取顺序,选择合适的索引等)。对于SELECT语句,在解析查询前,服务器会先检查查询缓存,如果能在其中找到对应的查询结果,则无需再进行查询解析、优化等过程,直接返回查询结果。存储过程、触发器、视图等都在这一层实现。
第三层是存储引擎,存储引擎负责在MySQL中存储数据、提取数据、开启一个事务等等。存储引擎通过API与上层进行通信,这些API屏蔽了不同存储引擎之间的差异,使得这些差异对上层查询过程透明。存储引擎不会去解析SQL。
二. 锁
2.1 锁概念
共享锁(读锁):读锁是共享的,互不堵塞,多个客户可以同时读取同一个资源,而互不干扰。
排它锁(写锁):写锁是排它的,写锁会堵塞其他写锁和读锁,这样确保在给定的时间里只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。
2.2 锁粒度
表锁:会锁定整张表,一个用户在对表进行插入,删除,更新时需要先获得写入锁,这会堵塞其他用户对该表的所有读写操作,只有在没有写锁时其他读取的用户才能获得读锁,读锁之间是互不堵塞的。写锁比读锁具有更高的优先级,因此一个写锁请求可能会被插入到读锁队列的前面,像alter table语句会忽略存储引擎的锁机制,使用innoDB在增删改的时候是不会锁定表的
行级锁:行级锁可以最大程度的支持并发的处理(同时也带来了最大的锁开销),行级锁只在存储引擎中实现。
三.事务日志
事务日志可以帮助提高事务的效率,使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。因为事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多,事务日志持久后内存中被修改的数据在后台可以慢慢刷会磁盘。
四.InnoDB多版本并发控制(MVCC)
通过在每行记录后面保存两个隐藏的列来实现,这两个列一个是保存了行的创建时间,一个保存了行的过期时间(或删除时间),存储的是系统版本号,每开始一个新的事务,系统版本号都会自动递增。