High Performance MySQL Chapter1

  • mysql最重要最雨中不同的特性是他的存储引擎架构,这种架构的设计将查询处理(Query Processing)以及其他系统任务(Server Task)和数据的存储/提取分离,这种处理和存储分离的设计可以在使用时根据性能,特性以及其他需求来选择数据存储的方式。

  • MySQL逻辑架构
    这里写图片描述
    最上层的服务并不是MySQL所特有的,大所属基于网络的客户端/服务器的工具或者服务都有类似的架构,比如连接处理,授权认证,安全等等。
    第二层架构师MySQL比较有意思的部分,大多数MySQL的核心服务都在这一层,包括查询解析,分析,优化,缓存以及所有的内置函数,所有存储引擎的功能都在这一层实现:存储过程,触发器,视图等等。
    第三层包含了存储引擎,存储引擎负责MySQL中数据的存储和提取。

  • 连接管理与安全性,每个客户端都会在服务器进程中拥有一个线程,这个链接的查询只会在这个单独的线程中执行,该线程只能轮流的在某个CPU核心或者CPU中运行,服务器会负责缓存线程,因此不需要为每一个新建的连接创建或销毁线程。

  • 优化与执行:MySQL会解析查询,并创建内部数据结构,然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引等。对于SELECT语句,在解析查询之前,服务器会检查查询缓存,如果能够在其中找到对应的查询,服务器就不必再执行查询解析,优化和执行的整个过程,二十直接返回查询缓存中的结果集。

  • 事务就是一组原子性的SQL查询,或者说一个独立的工作单元,如果数据库引擎能够成功的对数据库应用改组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行,也就是说,事务内的语句,要么全部执行,要么全部执行失败。可以使用START TRANSACTION开始一个事务,然后使用COMMIT提交事务,或者使用ROLLBACK撤回所有的修改

START TRANSACTION;
SELECT balance FROM checking WHERE customer_id = 10233276;
UPDATE checking SET balance = balance - 200 WHERE customer_id = 10233276;
UPDATE savings SET balance = balance + 200 WHERE customer_id = 10233276;
COMMIT;
  • 隔离级别
隔离级别脏读可能性不可重复读可能性幻读可能性加锁读
READ UNCOMMITTEDYESYESYESNO
READ COMMITTEDNOYESYESNO
REPEATABLE READNONOYESNO
SERIALIZABLENONONOYES

READ UNCOMMITTED(未提交都) 在这个隔离级别下,事务中的修改即时没有提交,对其他事物也都是可见的,事务可以读取为提交的数据,这称为脏读(Dirty Read)。这个级别会导致很多问题,性能也没有好太多
READ COMMITTED(提交读) 大多数数据库系统的默认隔离级别都是READ COMMITTED(但MySQL不是)READ COMMITTED满足前面提到的隔离性的简单定义,一个事物开始时,只能看见已经提交的事务所做的修改,换句话说,一个事务从开始知道提交之前,所做的任何修改对其他事务都是不可见的,这个级别有时候也叫做不可重复读(nonrepeatable read)因为两次执行同样的查询,可能会得到不一样的结果。
REPEATABLE READ(可重复读)解决了脏读的问题,该级别报这个了在同一个事务中多次读取同样的记录结果是一致的,但是理论上可重复读隔离级别还是无法解决另一个幻读(Phantom Read)的问题,所谓幻读,当某个事务在读取某个范围的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时会产生幻行(Phantom Row),InnoDB和XtraDB存储引擎通过多版本并发控制(MMVC, Multiversion Concurrency Control)解决了幻读的问题,可重复读史MySQL的默认事务隔离级别,
SERIALIZABLE是最高的隔离级别,他通过强制事务串行执行,避免了前面的幻读问题,SERIALIZABLE会在读取的每一行数据上都加锁,所以导致大量的超时和锁争用的问题。

  • 自动提交(AUTOCOMMIT), MYSQL默认采用自动提交模式,也就是说,如果不是显示的开始一个事务,则每个查询都被当作一个事务执行提交操作,在当前连接中,可以通过设置AUTOCOMMIT变量来启动或者禁用自动提交模式。
    这里写图片描述
    1或者ON表示启用,0或者OFF表示禁用,当AUTOCOMMIT=0时,所有的查询都是在一个事务中,知道显示的执行COMMIT提交或者ROLLBACK回滚,该事物结束,同时又开始了另一个新事务。修改AUTOCMMIT对非事务型的表,比如MyISAM或者内存表,不会有任何影响,对这类表来说,没有COMMIT或者ROLLBACK的概念,也就是说相当于一直处于AUTOCOMMIT启用的模式。

  • MySQL可以通过SET TRANSACTION ISOLATION LEVEL命令来设置隔离级别,新的隔离级别会在下一个事务开始的时候生效,可以在配置文件中设置整个数据库的隔离级别,也可以指改变当前绘画的隔离级别
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;MYSQL能够识别所有的4个ANSI 隔离级别,InnoDB引擎也支持所有的隔离级别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值