mysql架构 2019-04-01

    1. 架构

      第一层(最上层):这个大多软件都有的,比如链接处理,授权认证,安全等

      第二层(核心服务层):这层包括查询解析,分析,优化,缓存以及所有的内置函数。所有跨库存储引擎都在这层实现。例如存储过程,触发器,视图;

      第三层(存储引擎),负责mysql 数据的存储和提取,每个存储引擎都有各自的优劣。


    2. 优化执行

      mysql会解析查询,并创建数据结构(解析树),然后对其进行各种优。用户可以通过(hint)优化器,影响他的决策过程。也可以请求优化器解释(explain)优化过程的各个因素,使用户可以知道服务器是如何优化决策的。优化器并不关心使用的什么存储引擎,但是,存储引擎对优化查询是有影响的。对于select语句,在解析之前,服务器会先检查查询缓存,如果找到对应数据,则不必再执行查询解析、优化和执行过程而是直接返回结果。


    3. 读写锁

      为了防止多个进程访问和修改同一条数据,经典的解决办法是并发控制,在并发读或写时,可以通过两种锁的系统解决问题。一个是共享锁(读锁 share lock),一个是排他锁(写锁 exclusive lock)。读锁是共享,互不阻塞。写锁是排他的,也就是一个写锁会阻塞其他的(读、写)锁,这是出于安全考虑。


    4. 锁粒度

      提高共享资源并发性的方式就是让锁定对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有资源。更理想的方式是,只对会修改的数据片进行精确的锁定。任何时候锁的数据越少,并发成都越高。只要互不冲突即可。但是加锁也是消耗资源,如果花大量时间来管理锁而不是存取数据,那系统性能可能因此受到影响。所谓锁策略就在锁的开销和安全性之间寻找平衡。下面介绍两种最重要的锁策略


    5. 表锁 table lock

      表锁是mysql中最基本的锁策略,并且是开销最小的策略。顾名思义,表锁就是锁定整张表。


    6. 行锁 row lock

      行锁可以带来最大的并发支持,但是也带来了最大的锁开销。在innodb以及一些存储引擎中实现了行级锁。行级锁只在存储引擎层出现,而mysql服务层没有实现。


    7. 事务acid

      一般我们做一个逻辑操作有多条插入更新的语句,如果其中一条失败了,那会造成数据混乱。那么这时候就需要用事物。当所有sql执行成功则commit提交。至于acid是什么呢?

      原子性(A atomicity):一个事务被视作不可分割的最小的工作单元,整个事物要么全部操作成功提交,要么全部失败回滚。这就是原子性。

      一致性(C consistency):数据库总是从一个一致性状态转换到另一个一致性状态,如果sql执行不通过,则最终没有提交就不会保存到数据库中。

      隔离性(I isolation):通常一个事务在最终提交以前,对其他事物是不可见的。例如A进程把语文的分数从60分修改到100分,在还没完成提交时这时候B进程来读取语文的分数还是60分。但是主要看隔离级别。

      持久性(D durability)一旦事务提交,则所做修改会永久保存到数据库中。即使系统崩溃,修改的数据也不会丢失。

      当然事务和锁一样,也会增加系统开销。


    8. 死锁

      死锁是指两个或两个以上事务在同一个资源上互相占用,请求锁定对方数据。

      例如:

      事务1 有两条更新,第一条修改id为1的,第二条修改id为2的。

      事务2 也是两条更新, 第一条修改id为2的,第二条修改id为1的。

      如果刚好两个都执行了第一条update,同时也锁定该行数据。接着又尝试执行第二条,却发现该行被对方锁死了。然后两个都在等待对方释放锁,而同时又持有对方需要的锁。则陷入死循环。除非外部记入才可能解除死锁。

      为解决问题,数据库设计了各种死锁检测,死锁超时机制。比如innodb,检测到死锁,返回一个错误。还有就是查询时间达到锁超时时间等待超时放弃锁请求,这种通常来说不太好。innodb目前处理死锁是将持有最少行级排它锁的事务进行回滚。


    9. 事务日志

      事务日志可以帮助提高事务效率。使用日志,存储引擎在修改数据时,只需要修改其内存拷贝,再把修改行为持久化到硬盘日志中,而不需要每次修改数据都持久到硬盘里。



    10. mysql中的事务

      1.mysql采用自动提交,如果不显式的开启一个事务,则每个操作都被当一个事务。

      2.事物中混合存储引擎:事务是由存储引擎实现的,所以在同一个事务中使用多个存储引擎是不可靠的。如果你用事务型引擎和非事务型引擎的话,如果需要回滚,非事务的表上的变更时无法撤销的,这将导致数据不一致。


    11. 隐式和显式锁定

      innodb在事务过程中,随时可以执行锁定。锁定只有在提交或回滚时才释放。并且所有锁都在同时释放。这些都是隐的式,innodb会根据隔离级别的时候自动加锁。另外,也可以通过特定语句显式锁定如 select ... lock in share mode 和 select ... for update


    12. 存储引擎推荐:大部分情况下请选择innodb,除非要用到innodb不具备的特性!除非万不得已,不要混合多种引擎。否则可能带来一系列问题。如果需要不同的引擎,请先考虑以下几个因素。

      1.事务(innodb事务稳定) 2.备份(多种引擎备份不容易,如果选择innodb就可以实现热备份) 3.崩溃恢复(innodb崩溃恢复速度比较快,崩溃损失比较小)  4.特有的特性

      当你无法选择哪个引擎为合适的存储引擎时 ,那么就用innodb