zoukankan      html  css  js  c++  java
  • 阅读笔记-【高性能MySQL】第一章-MySQL架构与历史

    阅读笔记-【高性能MySQL】

    第一章-MySQL架构与历史

    概述:

    MySQL灵活、能够适应高要求环境;

    1.1 MySQL 逻辑结构

        包含三层:
    
            第一层是:客户端的链接/线程处理(该层不是MySQL独有的)主要用于链接处理、授权认证、安全等等;
    
            第二层是:MySQL的核心服务功能都在这块,包括解析分析优化缓存以及所有的内置函数,所有夸存储引擎的功能都在这一层实现:存储过程、触发器、
    视图等等;
    
            第三层是:包含了存储引擎。负责mysql中数据的存储和提取。
    

    1.1.1 链接管理与安全性

        链接->[链接是否成功]->继续验证权限
    

    1.1.2 优化与执行

        两种方式:
            1、用户通过特殊的关键字提示优化器,影响它的决策过程;
            2、请求优化器解释优化过程的各个因素;
    

    1.2 并发控制

        两个层面的并发控制:
            1、服务器层;
            2、存储引擎层;
    

    1.2.1 读写锁

        1、共享锁(shared lock)也称之为:读锁(read lock):
                读锁是共享的,多个客户在同一时刻可以读取同一资源,而互不干扰。
        2、排他锁(exclusive lock)也称之为:写锁(write lock):
                写锁是排他的,一个写锁会阻塞其他的写锁和读锁。
    

    1.2.2 锁粒度

        一种 提高 共享资源 并发性 的 方式就是让 锁定对象更有选择性。
        在给定的资源生,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可。
    
        注意:
            加锁是会消耗性能的。
            所谓的锁策略,就是在锁的开销和数据的安全性之间寻求平衡。
    

    两种重要的表锁结构:

    表锁

        表锁是MySQL中 最基本的 锁策略, 并且是 开销最小的锁策略。
    
        在表锁中:一个写锁请求可以插入到锁队列的 最前面,反之读锁则不能插入到写锁的前面。
    

    行级索

        行级锁可以最大程度的支持并发处理,同时也带来 最大的锁开销 的锁策略。
    
        行级锁只在 存储引擎 层实现。
    

    1.3 事务

        描述:事务就是一组 原子性 的SQL查询 ,事务内的语句,要么全部执行成功,要么全部执行失败。
    
        START TRANSACTION 语句开始一个事务,使用 COMMIT 提交事务将修改的数据永久保存, 使用 ROLLBACK 撤销所有的修改。
    
        事务的 ACID 概念
    
            A:原子性(atomicity)
                一个事务必须被视为一个不可分割的最小工作单元,整个事务的所有操作要么全部提交成功,要么全部回滚失败,对于一个事务而言,不可能只执行
            其中的一部分操作,这就是 事务 的 原子性。
    
            C:一致性(consistency)
                数据库总是从一个一致性的状态转换到另一个一致性的状态。
                一致性可以确保在运行时数据库崩溃后,也不会对数据进行修改,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中
    
            I:隔离性(isolation)
                通常来说,一个事务所做的修改修改在最终提交以前,对其他事务是不可见的。
    
            D:持久性(durability)
                一旦事务提交后,其所做的修改就会永久保存到数据库中。
    

    1.3.1 隔离级别

        定义了四种隔离级别:
            1、READ UNCOMMITTED(未提交读)
                在 READ UNCOMMITTED 级别,事务的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称之为 脏读(Dirty Read)。
    
                除非必要,在实际应用中一般很少使用。
    
            2、READ COMMITED(提交读)
                不是MySQL的默认隔离级别;
                一个事务从开始知道提交前,所做的任何修改对其他事务都是不可见的。也叫做 不可重复读(nonrepeatable read),因为两次执行同样的语句,可
            能会得到不一样的结果。
    
            3、REPEATABLE READ(可重复读)
                是MySQL默认的隔离级别;
    
                REPEATABLE READ 解决了脏读的问题。该级别保证了在同一事务中多次读取同样记录的结果是一致的。
    
                但无法解决另一个问题:
                    幻读(Phantom Read) 指在某个事务再次读取该范围的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围
                的记录时会产生幻行(Phantom Row);
    
            4、SERIALIZABLE(可串行化)
                SERIALIZABLE是最高的隔离级别。
                它通过强制事务串行执行,避免了前面说的幻读问题。
                SERIALIZABLE会在读取的每一行数据都加上锁,所以可能导致大量的超时和锁争用问题
                实际应用中也很少运用该级别的隔离事务,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑采用该级别。
    

    ANSI SQL 隔离级别

    隔离级别脏读可能性不可重复可能性幻读可能性加锁读
    READ UNCOMMITTED(未提交读)YesYesYesNo
    READ COMMITED(提交读)NoYesYesNo
    REPEATABLE READ(可重复读)NoNoYesNo
    SERIALIZABLE(可串行化)NoNoNoYes
  • 相关阅读:
    Android学习(二)
    密码与安全新技术专题之AI与密码
    Android学习(一)
    冲刺周六The Sixth Day(6.1)
    冲刺周日The Seventh Day(6.2)
    冲刺周五The Fifth Day(5.31)
    冲刺周四The Fourth Day(5.30)
    冲刺周三The Third Day(5.29)
    冲刺周二The Second Day(5.28)
    冲刺周一The First Day(5.27)
  • 原文地址:https://www.cnblogs.com/YeYunRong/p/8596143.html
Copyright © 2011-2022 走看看