最近开始自学MySQL优化,继续上次并发编程的学习节奏,工作之余,尽可能地看一看,学一学。
首先,分析一下对数据库性能影响比较大的一些因素:SQL查询速度、网卡流量、服务器硬件、磁盘IO等....
1、超高的QPS和TPS。由于MySQL不支持多CPU并发运算,即一条SQL语句只能使用一个CPU执行,故常用QPS和TPS来衡量SQL的处理效率(假如某CPU1秒钟处理100条SQL语句,即称QPS<=100),大多数性能问题都是由慢查询造成的,即大多数性能问题都可以通过优化SQL语句来解决。
注:QPS(Queries Per Second):数据库的每秒查询处理量。计算方法:QPS=QUESTIONS/UPTIME;
TPS(Transactions Per Second):数据库的每秒传输的事物处理个数,主要是对事务性存储引擎(InnoDB)的一个性能指标。计算方法:TPS = (COM_COMMIT + COM_ROLLBACK)/UPTIME 。
2、大量的并发和超高的CPU使用率。大量的并发使数据库连接数被占满(MySQL的连接数一般由max_connections决定,默认为100),超高的CPU使用率使CPU资源耗尽而出现宕机。
3、磁盘IO。磁盘IO是数据库服务器的主要使用瓶颈之一。常见风险有磁盘IO性能突然下降(使用更快的磁盘设备)、执行大量消耗磁盘性能的计划任务(调整计划任务,平时注意磁盘的维护)。
4、网卡流量。常见风险为网卡IO被占满(1000Mb/8 == 100MB)。为了避免这种情况,应当:减少从服务器的数量、缓存要进行分级缓存、避免使用“select * ”这样的查询、分离业务网络和服务器网络(避免数据同步、主从备份等影响网络性能)。
补充:大表、大事务带来的影响。
1.1、大表带来的影响。大表(没有明确的规定来判断什么是大表,下面的大表从两个维度来分:记录行数巨大,单表超过千万行;表数据文件巨大,表数据文件超过10G)。
大表对查询的影响:产生慢查询:很难在一定的时间内过滤出所需要的数据。
大表对DDL操作的影响:
1、建立索引将需要很长的时间。MySQL在5.5版本以前,建立索引会锁表,5.5版本以后虽不会锁表,但会引起主从延迟。
2、修改表结构需要长时间锁表。这将会引起长时间的主从延迟、在主库上修改表结构时将会影响正常的数据操作(被阻塞)
1.2、大表对应的处理。主要有两种方式:分库分表(难点:分表主键的选择,根据实际业务场景决定;分表后跨分区数据的查询和统计)、大表的历史数据归档(减少对前后端业务的影响,难点:归档时间点的选择;如何进行归档操作)。
2.1、大事务带来的影响。
事务的定义:
1、事务是数据库系统区别于其他一切文件系统的重要特性之一;
2、事务是一组具有原子性的SQL语句或一个独立的工作单元;
事务的特性:
1、原子性(Atomicity):一个事物必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败,对于一个事务来说,不可能只执行其中的一部分操作。
2、一致性(Consistency):事务将数据库从一种一致性状态转换到另一种一致性状态,在事务开始之前和事务结束后数据库中数据的完整性没有被破坏。
3、隔离性(Isolation):一个事物对数据库中数据的更改在其未提交完成之前对其他事务是不可见的(1、从某种角度上来说,隔离性高低与并发性高低成反比;2、innoDB默认隔离级别是"可重复读"而不是"读已提交")。
SQL标准中定义的四种隔离级别:
·未提交读(READ UNCOMMITED),产生脏读;
·已提交读(READ COMMITED),大多数数据库中的默认隔离级别,然而MySQL是个例外。事务未提交前对其他事务是不可见的;
·可重复读(REPEATABLE READ),保证同一个事务中对该数据的多次读取是一致的,相比于此,已提交读又称为不可重复读。
·可串行化(Serializable),最高的隔离级别,基本就是给每行数据都加锁。
4、持久性(Durability):一旦事务提交,则其所作的修改就会永久保存到数据库中,即是系统崩溃,已提交的数据也不会丢失。
大事务:运行时间较长,操作的数据较多的事务。造成风险:1、锁定太多数据,造成大量的阻塞和锁超时;2、回滚所需时间比较长且回滚时数据仍然处于锁定状态;3、执行时间长,容易造成主从延迟。
如何处理大事务问题:
1、避免一次处理太多数据。
2、移除不必要的select操作,尽量保证事务中都是必要写的操作。