0
点赞
收藏
分享

微信扫一扫

高性能Mysql

悲催博士僧 2022-03-21 阅读 87
mysql

Mysql的结构

Mysql的逻辑架构

在这里插入图片描述
如图是Mysql各组件的架构图。
第一层是连接客户端。功能比如连接处理、授权认证、安全等。
第二层是服务器。它包含了Mysql的核心功能,包括查询解析、分析、优化、缓存以及所有的内置函数,所有跨存储引擎的功能都在这一层:存储过程、触发器、视图等。
第三层是存储引擎。存储引擎负责Mysql中数据的存储和提取。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对于上层的查询过程透明。
这些接口函数,执行诸如“开始一个事务”、“根据主键提取一行数据”等等操作。

连接安全与管理

每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程处理。服务器会缓存线程,因此不需要为每一个新建的连接创建或销毁线程。

并发控制

多个查询需要在同一时刻修改数据,就会产生并发控制的问题。

读写锁

并发读或者写时,可以通过一个由两种类型的锁组成的锁系统来解决问题。通常称为共享锁和排他锁,也叫读锁和写锁。
读锁是共享的,互相不阻塞。写锁是排他的,也就是说一个写锁会阻塞其他的写锁和读锁(不管是否是同一个线程,即如果线程先获取读锁,必须先释放这个读锁,才能获取写锁)。
锁也是需要消耗资源的。锁的各种操作,如获得锁,检查锁是否已解除,释放锁等,都会增加系统的开销。如果花费大量的时间来管理锁,而不是存取数据,那么系统的性能可能会受到影响

事务

事务必须具备四个特性原子性、一致性、隔离性、持久性,ACID。
隔离性:一个事务的修改,在提交以前,对其他事务是不可见的。
持久性:一旦事务提交,则其所做的修改就会永久保存到数据库中。即使系统崩溃,数据也不会丢失。

隔离级别

读未提交:事务中放入修改,即使没有提交,对其他事务也是可见的。会产生脏读。
读已提交:一个事务开始时,只能看见已经提交的事务所做的修改。解决了脏读,但会产生不可重复读。
可重复读:在同一个事务中,多次读取同样记录的结果是一致的。解决不可重复读,但可能产生幻读。所谓幻读,指的是当事务在读区某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。innodb通过mvcc解决了幻读的问题。
串行化:它强制事务串行执行,避免了幻读的问题。

死锁

两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

事务日志 WAL

使用事务日志,存储引擎在修改表的数据时,只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久化到磁盘。事务日志采用追加的方式,不像随机IO需要在磁盘的多个位置移动磁头,所以很快。事务日志持久以后,内存中被修改的数据可以在后台慢慢的刷回磁盘。我们通常称之为预写式日志(WAL),修改数据需要写两次磁盘。
如果事务的修改已经

举报

相关推荐

0 条评论