MySQL基础-第一章

1.MySQL服务器逻辑架构图

主要关注第二层架构。大多数MySQL的核心服务功能都在这一层,包括查询解析,分析,优化,缓存以及所有内置函数,以及所以跨存储引擎(通用)功能也都在这一层实现,例如:存储过程,触发器,视图等。

 

2.MySQL的优化与执行

        MySQL会执行查询,并创建内部数据结构(解析树),然后对其做各种优化,包括重写查询、决定表的读取顺序以及合适的索引。对于 SELECT 语句,参考逻辑架构图,在解析查询之前,服务器会先检查查询缓存(Query Cache),如果能够找到,则服务器无需再次查询解析、优化和执行,而是直接返回查询缓存中的结果集。

 

3.基于读写锁并发控制

        无论何时,只要有多个操作需要在同一时刻修改数据,将产生并发控制的问题。MySQL通过锁来控制并发读或者并发写。

        a.共享锁(夏洛克 shared lock)也被称为读锁(read lock)。读锁是共享的,多个客户在同一时刻可以读取同一个资源,而互不干扰。

        b.排它锁(exclusive lock)也被称为写锁(write lock)。写锁会阻塞其他的锁(包括写锁和读锁),这样既保证一次只有一个用户写入【且非完整写入信息不会被读取到】(需要结合事务)。

       需要注意,写锁具有高优先级,写锁可能会插队到读锁之前。

 

5.基于锁策略并发控制

        一种提高共享资源并发的方式就是对资源的锁定具有粒度选择性,尽量只锁定需要修改的部分。在给定的资源上,锁越少,系统并发程度越高。但是数据准确性、安全性也非常重要,所以,所谓锁策略是指:在锁的开销和数据的安全行之间寻求平衡,当然这种平衡也会影响到性能(锁的各种操作如获得锁,检查锁,释放锁都会增加系统开销)。

        a.表锁(table lock)。表锁是MySQL中最基本的锁策略,即对整张表的锁定。

        b.行级锁(row lock)。行级锁可以最大程度支持并发处理,行级锁只在存储引擎层实现,不同的存储引擎可能有不同的实现。

 

6.事务

        事务是指一组原子性的SQL查询,或者说一个独立的工作单元。事务拥有4个特性ACID。

        a)原子性(atomicity) 一个事务是不可分割的最小工作单元,整个事务中的操作全部提交成功或全部失败回滚。

        b)一致性(consistency) 只能从一个一致性状态转换到另一个一致性状态。

        c)隔离性(isolation) 通常来说,一个事务所做的修改,在最终提交以前,对其他事务是不可见的。

        d)持久性(durability) 理解为写入磁盘。

        一个实现了ACID的数据库相比没有实现ACID的数据库,通常需要更强的CPU处理能力、更大的内存和更多的磁盘空间。

       6.1 隔离级别

           较低的隔离级别通常可以执行更高的并发,系统的开销也更低。

           READ_UNCOMMIT(未提交读):事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据也被称为 脏读(Dirty Read),从性能上来说,READ UNCOMMIT 不会比其他的级别好太多,但是会招致很多麻烦,,较为少用。

           READ_COMMIT(提交读):大多数数据库系统的默认隔离级别(MySQL不是),READ_COMMIT满足事务的简单定义“一个事务开始时,只能看见已经提交的事务所做的修改”。换句话说:一个事务从开始直到提交之前,所做的任何修改对其他事务都不可见。这个级别有时候称为不可重复读(nonrepeatable  read)。该级别下执行同样的查询,有可能得到不一样的结果。

           REPEATABLE_READ(可重复读):MySQL使用的默认隔离级别。该级别可以避免脏读。但是无法避免幻读(Phantom Read),幻读是指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前事务再次读取该范围的记录时,会产生幻行(Phtantom Row),一般通过MVCC(多版本并发控制)可以解决幻读问题。

           SERIALIZABLE(可串行化):最高隔离级别,强制事务串行执行,避免了幻读问题。SERIALIZABLE会在读取每一行数据都加锁,所以可能导致大量的超时和锁竞争问题。实际中较少用到。

ANSI SQL隔离级别

 

7.死锁

        当多个事务试图以不同的顺序锁定资源时,就可能产生死锁;多个事务同时锁定一个资源时,也会产生死锁。举例:

        事务1:

               START TRANSACTION;

               UPDATE STOCK_PRICE SET CLOSE = 45.50 WHERE ID = 4 AND DATA = '2002-05-01';

               UPDATE STOCK_PRICE SET CLOSE = 25.50 WHERE ID = 3 AND DATA = '2002-05-02';

               COMMIT;

         事务2:

               START TRANSACTION;

               UPDATE STOCK_PRICE SET HIGH = 34.50 WHERE ID = 3 AND DATA = '2002-05-02';

               UPDATE STOCK_PRICE SET HIGH = 28.50 WHERE ID = 4 AND DATA = '2002-05-01';

               COMMIT;

如果事务1和事务2正好都执行了第一条update,更新并锁定当前行,此时则产生死锁。目前数据库系统都有死锁检测和死锁超时机制,大多数情况下,只需要重新执行因死锁回滚的事务即可。

 

8.事务日志

        事务日志可以帮助提高事务的效率,事务日志是内存操作,然后把该修改行为记录到硬盘上的事务日志中,即日志持久化之后,后台可以慢慢的把数据刷回到数据库中,这样的方式称之为预写式日志(Write-Ahead Logging),写数据会有两次磁盘操作。

posted on 2018-07-06 17:24  _only_deng  阅读(176)  评论(0编辑  收藏  举报

导航