阅读笔记-【高性能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(未提交读)

Yes

Yes

Yes

No

READ COMMITED(提交读)

No

Yes

Yes

No

REPEATABLE READ(可重复读)

No

No

Yes

No

SERIALIZABLE(可串行化)

No

No

No

Yes