高性能mysql(一)

1.连接和管理安全性

  当客服端连接mysql服务器时,这个客户端就会在服务器端拥有一个线程,这个连接的查询就会在这单独的线程中执行。服务器会负责缓存线程,因此不需要为每一个连接都创建一个线程或者销毁一个线程。(mysql5.5或者更新的版本提供了一个api,支持线程池插件,可以使用线程池中少量连接完成多个连接)。

  当客户端连接应用连接到mysql服务器时服务器需要对其认证,认证基于用户名和原始主机的密码,一旦连接服务器成功,服务器会进而判断该客户端是否具有执行特定查询的权限。

  在查询过程中,mysql自己会解析查询创建内部数据结构(解析树),然后对其进行各种优化,包括重新查询和决定表得读写顺序,以及合适得索引等,用户可以通过关键字提示优化器,影响他的决策过程。对于select语句mysql服务器会先检查缓存(Query Cache),如果在其中能够找到对应得查询,服务器就不会在执行查询,解析和优化的过程。而是直接返回查询缓存中的结果集。

2.并发控制

  无论何时,只要又多个查询需要在同一时刻修改数据,都会产生并发控制的问题。

  在处理并发读或者写时,可以通过实现一个两中类型的锁组成的锁系统来解决问题。这两种锁通常被称为共享锁和排他锁,也叫读锁和写锁。其中读锁是共享的,也就是无阻塞的,多个用户同一时刻读取共同的资源互不干扰。写锁是排他的,也就是说一个写锁会阻塞其他的读锁和写锁,这是出于安全策略的考虑,只有这样,才能保证在同一时间里只有一个用户执行写入,并防止其他用户正在读取同一资源。

  在实际的数据库中,每时每刻都存在着锁定的发生,当mysql修改某一部分的数据时,mysql就会通过锁定防止其他用户读取同一数据。

3.锁策略 

  所谓的所策略,也就是在锁的开销和数据安全性之间去衡量的策略。锁的管理是个非常重要的决定。将锁固定在某个级别可以为某些特定的场景提供更好的性能,但同时可能对另外一些场景不能更好的支持。以下是两个重要的锁策略。

  表锁:

    表锁是mysql最基本的锁策略,并且是开销最小的锁策略。它会锁定整张表,一个用户在对表进行写操作时(插入,删除,更新等)前,需要先获得写锁,着会其他用户对表的所有读写操作。

  行级锁

    行级锁可以最大的程度支持并发处理(同时也带来最大的锁开销),众所周知,在innodb以及其他一些引擎中实现了行级表。

4.事务

  事务就是一组原子性(后面会讲事务的原子性)或者说是一个独立的工作单元。事务内的语句要么全部执行成功,要么全部执行失败。银行应用是解释事务必要性的一个经典的例子。假设银行的数据库有两张数据表, 支票表和储蓄表。闲杂要从用户的支票中成功的转移200美元到别人的账户,首先要判断用户账户够不够200美元,然后从用户余额中减去200美元,最后在别人账户上增加200美元。

  以上三个步骤必须打包在一个事务中,如果任何一个步骤失败,则必须回滚所有步骤。具体语法请查询相关资料。

  除非系统经过严格的ACID测试,否则空谈事务的概念是不够的。其中这几个字母表示原子性,一致性,隔离性和持久性。一个运行良好的事务处理,必须具备这些标准特性。

    原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所哟操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

    一致性:数据库总是从一个一致性的状态转换到另外一个应执行的状态。即使执行三,四条语句之间时系统崩溃,支票也不会损失。因为事务最终没有提交,所以事务所做的修改也不会执行。

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

    持久性:一旦事务提交,所有的操作就会永久的保存到数据库中。

5.死锁

  死锁是指两个事务或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图一不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源的时候,也会产生死锁。例如两个事务都同时更新一行数据,同时也锁定该行的数据。接着每个事务又去执行第二条语句,却发现该行已经被锁定,然后两个事务都等待对方释放锁,同时又持有对方需要的锁,则陷入死循环。

  为了解决这个问题,数据库系统实现了各种死锁检测和死锁超时机制。越复杂的系统,比如innodb越能检测到死锁的循环依赖,并立即返回一个错误。这种解决方式很有效,否则死锁很导致非常慢的查询。还有一种解决方式,就是当查询的时间达到锁等待超时的设定后放弃锁请求,这种方式通常来说不太好。innodb目前处理死锁的方法是将持有最少行级拍他所的事务进行回滚(这是相对表叫简单的死锁回滚算法)。

  

上一篇:PLSQL导入/导出数据方法


下一篇:BZOJ1823[JSOI2010]满汉全席——2-SAT+tarjan缩点