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目前处理死锁的方法是将持有最少行级拍他所的事务进行回滚(这是相对表叫简单的死锁回滚算法)。

  

高性能mysql(一)的更多相关文章

  1. 高性能Mysql主从架构的复制原理及配置详解

    温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...

  2. 1121高性能MySQL之运行机制

    本文来自于拜读<高性能MySQL(第三版)>时的读书笔记作者:安明哲转载时请注明部分内容来自<高性能MySQL(第三版)> MySQL的逻辑构架 MySQL服务器逻辑架构 最上 ...

  3. 《高性能MySQL》读书笔记--锁、事务、隔离级别 转

    1.锁 为什么需要锁?因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对表中同一行记录进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进 ...

  4. 高性能MySQL --- 读书笔记(1) - 2016/8/2

    此书不但帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径.全书包括14章,内容覆盖MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优. ...

  5. 《高性能MySQL》

    <高性能MySQL>(第3版)讲解MySQL如何工作,为什么如此工作? MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优.系统配置管理和安全设置.监控分析,以及复制.扩展和 ...

  6. 转:高性能Mysql主从架构的复制原理及配置详解

    温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...

  7. 高性能MySql进化论【转】

    高性能MySql进化论(十二):Mysql中分区表的使用总结 http://binary.duapp.com/category/sql 当数据量非常大时(表的容量到达GB或者是TB),如果仍然采用索引 ...

  8. 高性能Mysql主从架构的复制原理及配置详解(转)

    温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...

  9. 高性能mysql主存架构

    原文:高性能mysql主存架构 MySQL Replication(Master与Slave基本原理及配置) 主从mysql工作原理: 1:过程: (1)Mysql的复制(replication)是一 ...

  10. 《高性能MySQL(第3版)》【PDF】下载

    内容简介 <高性能mysql(第3版)>是mysql 领域的经典之作,拥有广泛的影响力.第3版更新了大量的内容,不但涵盖了最新mysql5.5版本的新特性,也讲述了关于固态盘.高可扩展性设 ...

随机推荐

  1. Object-C开发常用宏定义

    Object-C开发中宏会将经常用到的系统常量进行封装,方便使用: 1.获取通知中心 #define EYNotificationCenter(name, object, userInfo) [[NS ...

  2. 老李分享:HTTP协议之请求和响应

    老李分享:HTTP协议之请求和响应   HTTP请求头详解: GET http://www.foo.com/ HTTP/1.1 GET是请求方式,请求方式有GET/POST http://www.fo ...

  3. ArcGIS API for JavaScript 4.2学习笔记[20] 使用参数查询要素(油井和地震关系)

    这个例子相当复杂.我先简单说说这个例子是干啥的. 在UI上,提供了一个下拉框.两个滑动杆,以确定三个参数,使用这三个参数进行空间查询.这个例子就颇带空间查询的意思了. 这个例子是干嘛的呢?第一个参数是 ...

  4. 云计算之路-阿里云上:RDS数据库连接数过万引发故障,主备库切换后恢复正常

    非常抱歉!今天 12:03-12:52 ,由于数据库连接数异常突增超过1万,达到了阿里云RDS的最大连接数限制,影响了全站的正常访问.由此给您带来麻烦,请您谅解. 在发现数据库连接数突增的问题后,我们 ...

  5. C#中的ArrayList

    ArrayList非常类似于数组,也有人称它为数组列表,ArrayList可以动态维护 提示: 和数组相似,ArrayList中存储的数据称为元素,ArrayList可以保存的元素数就是ArrayLi ...

  6. jdk动态代理与cglib代理、spring aop代理实现原理解析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  7. 查询sql server进程死锁方案

    SELECT a.spid , a.blocked , lastwaittype = RTRIM( a.lastwaittype ), waitresource = RTRIM( a.waitreso ...

  8. MVC框架中,遇到 [程序集清单定义与程序集引用不匹配]怎么办?

    项目里有一个WinForm程序,它需要使用一套第三方控件.而我的机器上存有这套控件的两种版本(一个是源码版,一个是演示版).结果经常出现“程序集清单定义与程序集引用不匹配的问题”的异常.最要命的是有时 ...

  9. nodejs+mongo 实现搜附近的人

    参考网址:http://blog.csdn.net/huangrunqing/article/details/9112227 用mongo作为存储,来实现搜索附近的人具有先天的优势, MongoDB原 ...

  10. Github+yeoman+gulp-angular初始化搭建angularjs前端项目框架

    在上篇文章里面我们说到了Github账号的申请与配置 那么当你有了Github账号并创建了一个自己的Github项目之后,首要的当然是搭建自己的项目框架啦! 本人对自己的定位是web前端狗,常用开发框 ...