高性能MySQL

High Performance MySQL

Posted by Wanglizhi on July 24, 2016

淘宝网数据库架构从垂直拆分走向水平拆分,MySQL则在大规模水平集群的架构设计中收到关注,2012年整个淘宝网核心交易系统已经全部运行在基于PC服务器的MySQL数据库集群中,全部实例数超2000个,MySQL单库经受了最高达6.5万的QPS

基础1-6

应用7-9

集群10~

第一章 MySQL架构与历史

MySQL逻辑架构

  • 第一层,服务层(为客户端服务):为请求做连接处理、授权认证、安全等
  • 第二层,核心层,包括查询解析、分析、优化、缓存以及所有的内置函数,所有跨存储引擎的功能:存储过程、触发器、视图等
  • 第三层,存储引擎,负责MySQL中数据的存储和提取

并发控制

主要讨论MySQL在两个层面的并发控制:服务器层和存储引擎层。并发景点的办法就是加锁。

读写锁

读锁:又叫共享锁,相互不阻塞;

写锁:又叫排他锁,一个写锁会阻塞其他的写锁和读锁;

锁粒度

一种提高共享资源并发性的方式就是让锁定的对象更有选择性。大多数商业数据库系统都是在表上施加行级锁(row level lock)。而MySQL则提供了多种选择,每种MySQL存储引擎都可以实现自己的锁策略和锁粒度。

表锁:最基本的锁策略,也是开销最小的策略,锁定整张表;

行级锁:可以最大程度的支持并发,也带来了最大的锁开销。

事务

事务就是一组原子性的SQL查询,或者说一个独立的工作单元,要么全部执行成功,要么全部执行失败。

ACID特性

  • 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元;
  • 一致性(consistency):数据库总是从一个一致性的状态转移到另外一个一致性的状态
  • 隔离性(isolation):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。
  • 持久性(durability):一旦事务提交,则所做的修改就会永久保存到数据库中。

隔离级别,SQL标准中定义了四种隔离级别(依次增强)

  • READ UNCOMMITTED(未提交读):事务可以读取未提交的数据,这也被称为脏读(Dirty Read)
  • READ COMMITTED(提交读):大多数数据库系统默认的隔离级别(但MySQL不是),一个事务从开始到提交前,所做的任何修改对其他事务都是不可见的。也叫作不可重复读(Nonrepeatable read),因为两次执行同样的查询,可能会得到不一样的结果。
  • REPEATABLE READ(可重复读):MySQL默认事务隔离级别,解决了脏读的问题,保证在同一个事务中多次读取同样记录的结果是一致的。但无法解决幻读的问题,即当某个事务在读取某个范围内的记录时,另外 一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。
  • SERIALIZABLE(可串行化):最高的隔离级别,通过强制事务串行执行,避免了幻读的问题。

死锁

死锁是指两个或多个事务在同一资源上相互占用,并穷求锁定对象占用的资源,从而导致二星循环的现象。为了解决这种问题,数据库系统实现了各种死锁检测和死锁超时机制。死锁发生以后,只有部分或者完全回滚其中一个事务,才能打破死锁。

多版本并发控制

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁,基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。MVCC的实现是通过保存数据在某个时间点的快照来实现的。

MySQL基准测试

为什么需要基准测试

因为基准测试时唯一方便有效的、可以学习系统在给定的工作负载下会发生什么的方法。基准测试可以观察系统在不同的压力下的行为,评估系统的容量,掌握哪些是重要的变化,或者观察系统如何处理不同的数据。

测试何种指标

  • 吞吐量:单位时间内的事务处理数(TPS)
  • 响应时间或者延迟:用于测试任务所需要的整体时间
  • 并发性:关注同时工作的线程数或者连接数,当并发性增加时,需要测量吞吐量是否下降,响应时间是否变长
  • 可扩展性:给系统增加一倍的资源(比如两倍CPU),就可以获得两倍的吞吐量,同时性能也必须在可以接受的范围

获取系统性能和状态:如CPU使用率、磁盘IO、网络流量统计、SHOW GLOBAL STATUS计数器等。

服务器性能剖析

最常碰到的三个性能相关的服务请求是:如何确认服务器是否达到了性能最佳的状态,找出某条语句为什么执行不够快,以及诊断被用户描述成“停顿”、“堆积”或者“卡死”的某些间歇性疑难故障。

看不下去了,未完待续……

参考:

《高性能MySQL》