1.并发控制
当多个查询需要在同一时刻对数据库的数据进行时,就会涉及到并发控制的问题,在mysql中,并发控制的手段主要是通过锁来实现。锁主要分为读写锁和粒度锁两大类。
读写锁:
顾名思义,读写锁又分为读锁和写锁
读锁:当客户端从数据库里面读数据时,不会涉及到数据的修改,因此这种锁是允许多个客户同时访问同一个资源的。因为他们是互不干扰的,无论多少人读那个资源,资源中的数据是不会改变的,因此,这种锁也叫共享锁
写锁:写锁与读锁是完全不同的,只要有一个客户对资源进行了写的操作,资源里的数据就会改变,试想一下,如果两个甚至更多人同时对资源里同一段数据进行修改,mysql会怎么处理呢?这个不可预料,因此,从安全的角度考虑,写锁是排他的,只要有一个客户端拿到锁还没有释放,那么将不允许其他人对数据库中的数据进行写的操作。
粒度锁:
粒度锁给我的感觉有点想是写锁的具体化,粒度锁都是排它的,它分为表锁和行级锁。
表锁:从字面上理解就是锁定一张表,即如果存在一个客户端正在操作表A中的数据,那么这张表将被锁定,直到该客户操作完成释放锁,才允许下一个客户继续操作,这样的方式简单粗暴,可以提供很好的安全性,缺点是,锁的范围有点武断了,也许客户A只修改表中的一行数据,你却把整个表都锁了,这是不是有点夸张了,比如我脸上有个蚊子,我让你帮我拍一下,你拿出来福枪直接给我来一下。从并发量的角度考虑,这样是不划算的。
行级锁:它与表锁又是对立的,行级锁是尽量使锁的范围小一些,以保证数据的并发量,但加锁也是需要消耗资源的,获得锁、检查锁的状态,释放锁等操作将会使系统花费大量的时间,大大地影响系统的性能。
2.事务
事务就是将一组SQL语句打包成一个原子操作,这一组语句里只要有一条语句执行出错,那么该数据库将回滚到事务执行之前。在MYSQL中事务具有以下几种特性:原子性、一致性、隔离性、持久性。
原子性:即将一个事务视为一个不可分割的最小工作单元,要么全部执行成功,要么全部回滚。
一致性:数据库总是从一个一致性的操作转换到另一个一致性的操作,即无论何时多个用户访问同一个资源时,该资源中的数据都是一样的。
隔离性:即一个事务在完成提交之前,对其他的事务是隔离的,即在提交之前其他用户访问该资源看到的是事务执行之前的数据
持久性:指通过事务修改数据后,该数据是永久地保存在数据库中的,无论出现何种情况,数据库中的数据也不会丢失。
3.死锁
死锁是指多个用户在同一资源上相互占用,并请求锁定对方已占用的资源,从而导致恶性循环。为了解决这种问题,数据库系统实现了各种死锁检测和死锁超时机制,但这样会导致用户的查询数据变慢,目前较为优秀的处理方式有InnoDB引擎的回滚机制,即将访问该数据的多个事务中持有最少行级排他锁的事务进行回滚。
4.多版本并发控制(MVCC)
我们可以将MVCC看作是行级锁的变种,虽然目前来说MVCC没有统一的实现机制,但是都实现了非堵塞的读操作,写操作也只锁定必要的数据,从而使系统的开销变低。
MVCC的原理:通过保存数据在某个时间点的快照来实现的。不同的存储引擎,其MVCC的实现方式也是不同的,典型的有乐观并发控制和悲观并发控制
5.基准测试
基准测试有两种主要的策略:一是针对整个系统的整体测试,也被称为集成式基准测试;另外一种是单独测试mysql,也被称为单组件式基准测试
测试各种指标:
在进行基准测试之前,需要先明确测试的目标,根据所选定的目标来选择测试工具和所使用的技术,常用的性能测试指标如下:
吞吐量:指单位时间内事务的处理数,常用的测试单位是秒,其次是分钟。
响应时间或延迟:这个指标用于测试任务所需要的整体时间。根据具体的应用,测试的时间单位可以是微秒、毫秒、秒或者分钟。根据不同的时
间单位可以计算出平均响应时间,最小响应时间、最大响应时间和所占的百分比。为了方便查看,可以将测试结果绘制成拆线图或散点图。
并发性:这里指的并发性并不是指web服务器的高并发,因为并不是每一个连接到web服务器的请求都需要访问数据库的,如果是这样,那这个系统设计就太糟糕了。要测试的是连接到数据库的并发量,当并发增加时,我们需要查看数据的吞吐量是否下降,响应时间是否变长。
可扩展性:即给系统增加一倍或更多的工作量或资源时,吞吐量和响应时间的变化比例。
6.mysql性能剖析:
值得优化的查询:性能剖析不会自动给出哪些查询值得花时间去优化,这个得我们自己去判断,大致的标准有两点。1.一些只占总响应时间比重很小的查询是不值得去优化的;二:如果优化的成本大于收益,也是不值得去进行优化的。
异常情况:有时候系统的性能剖析并不会显示所有需要优化的语句,比如某一段sql语句,虽然执行的次数较少,但其每次执行的速度很慢,这也会严重影响到用户体验,像这类情况是不可忽视的。
未知的时间开销:当我们进行性能测试的时候,会出现如下情况,假如总耗时为1分钟,但系统列出来的时间只有50秒,也就是说有10秒的时间被丢失了,也就是说我们在测量的时候有疏漏,对于这种情况,我们必须要弄清楚,并解决它。
被隐藏的细节:性能剖析是无法显示所有的响应时间的,一般情况下能够显示最大、最小响应时间,以及平均的时间,我们不能过度的相信平均时间,在看似正常的平均时间下,也有可能会隐藏的有值得优化的地方。
对应用程序进行性能剖析
大多数情况下,应用程序的性能是与数据库相关的,但也有例外,如下几点也可能会对应用程序的性能产生较大的影响
1.外部资源,比如调用了web服务或搜索引擎
2.应用需要处理大量的数据,比如分析一个超大的XML文件
3.在循环中执行特别费时的操作,比如连接数据库等
4.算法,在程序中使用了效率低下的算法。