zoukankan      html  css  js  c++  java
  • 高性能mysql读书笔记1

    1 mysql服务器逻辑架构图

    最上层并不是mysql独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等。

    第二层架构是mysql核心服务功能。包括查询解析、分析、优化、缓存以及所有的内置函数(例如日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等

    第三层包含了存储引擎。存储引擎负责mysql中数据的存储和提取。

    1.2 优化与执行

    mysql 会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读写顺序,以及选择合适的索引。

    对于 select 语句,在解析查询之前,服务器会检查查询缓存,如果能够在其中找到对应的查询,服务器就不必再执行查询解析、优化和执行的整个过程,而是直接返回查询缓存中的结果集。

    1.3 事务

    事务就是一组原子性的 sql 查询。要么全部执行成功,要么全部执行失败。

    ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)

    原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。一个事务不可能只执行其中的一部分操作,这就是事务的原子性。

    一致性:数据库总是从一个一致性状态转换到另一个一致性状态。即使执行到中间,因为最终没有提交,所以中间做的修改不会保存到数据库中。

    隔离性:一个事务所做的修改在最终提交以前,对其他事务是不可见的。

    持久性:一旦事务提交,所做的修改就会永久的保存到数据库中。

    1.4 隔离级别

    每一种隔离级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。

    READ UNCOMMITTED 未提交读:事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称作脏读。从性能上 READ UNCOMMITTED 不会比其他的级别好太多,但缺乏其他级别的好多好处。

    READ COMMITTED 提交读:大多数数据库默认隔离级别是 READ COMMITED。一个事务开始时,只能看见已经提交的事务所做的修改。这个级别有时候也叫做不可重复读,因为两次执行同样的查询,可能会得到不一样的结果。

    REPEATABLE READ 可重复度:解决了脏读的问题,该级别保证了在同一个事务中多次读取同样记录的结果是一致的。但是无法解决幻读,指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。innoDB通过多版本并发控制解决了幻读的问题。

    SERIALIZABLE 可串行化:是最高的隔离级别。通过强制事务串行执行,避免了前面说的幻读问题。

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

    3 事务日志:使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序IO,而不像随机IO需要在磁盘的多个地方移动磁头。所以采用事务日志的方式相对来说要快得多。

     4 隐式和显式锁定

    innoDB采用的是两阶段锁定协议,在事务执行过程中,随时都可以执行锁定,锁只有在执行COMMIT 或者 ROLLBACK 的时候才会释放,并且所有的锁在同一时刻被释放。

  • 相关阅读:
    HTML5学习总结-番外05 http 状态码
    Python开发技巧
    QPushButton class
    Qt class
    QTableWidgetItem class
    毕业设计进度10
    毕业设计进度9
    毕业设计进度8
    毕业设计进度7
    毕业设计进度6
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/12103968.html
Copyright © 2011-2022 走看看