高性能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目前处理死锁的方法是将持有最少行级拍他所的事务进行回滚(这是相对表叫简单的死锁回滚算法)。
高性能mysql(一)的更多相关文章
- 高性能Mysql主从架构的复制原理及配置详解
温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...
- 1121高性能MySQL之运行机制
本文来自于拜读<高性能MySQL(第三版)>时的读书笔记作者:安明哲转载时请注明部分内容来自<高性能MySQL(第三版)> MySQL的逻辑构架 MySQL服务器逻辑架构 最上 ...
- 《高性能MySQL》读书笔记--锁、事务、隔离级别 转
1.锁 为什么需要锁?因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对表中同一行记录进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进 ...
- 高性能MySQL --- 读书笔记(1) - 2016/8/2
此书不但帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径.全书包括14章,内容覆盖MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优. ...
- 《高性能MySQL》
<高性能MySQL>(第3版)讲解MySQL如何工作,为什么如此工作? MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优.系统配置管理和安全设置.监控分析,以及复制.扩展和 ...
- 转:高性能Mysql主从架构的复制原理及配置详解
温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...
- 高性能MySql进化论【转】
高性能MySql进化论(十二):Mysql中分区表的使用总结 http://binary.duapp.com/category/sql 当数据量非常大时(表的容量到达GB或者是TB),如果仍然采用索引 ...
- 高性能Mysql主从架构的复制原理及配置详解(转)
温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...
- 高性能mysql主存架构
原文:高性能mysql主存架构 MySQL Replication(Master与Slave基本原理及配置) 主从mysql工作原理: 1:过程: (1)Mysql的复制(replication)是一 ...
- 《高性能MySQL(第3版)》【PDF】下载
内容简介 <高性能mysql(第3版)>是mysql 领域的经典之作,拥有广泛的影响力.第3版更新了大量的内容,不但涵盖了最新mysql5.5版本的新特性,也讲述了关于固态盘.高可扩展性设 ...
随机推荐
- 20155304 2016-2017-2 《Java程序设计》第六周学习总结
20155304 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第十章 串流设计的概念 无论来源和目的地实体形式是什么,只要取得InputStream和Ou ...
- JavaScript高级程序设计---学习笔记(二)
面向对象程序设计1.属性类型.定义多属性.读取属性特性对象的属性在创建时都带有一些特征值,JavaScript通过这些特征值来定义它们的行为.这些特性是为了实现JavaScript引擎用的,因此不能直 ...
- 老李分享:adb发送的指令都有哪些
老李分享:adb发送的指令都有哪些 这两天在poptest上课的时候,我们邀请了业内技术牛人为我们的学员讲解手机自动化方面的知识,每天大家都很踊跃,要学习到晚上11点多才能,有的学员跟我说都累傻了 ...
- 基于WebForm和Bootstrap的权限框架解决方案 一.PQGRID的使用
天天打游戏也不是个事,就写一套权限框架吧,我的要求是即漂亮美观大方上档次,又要实用易用接地气. 按理来说应该先设计数据库在来秀的,但是人生就是这么随意,先搭个框子吧, 这一篇的重点是pqgrid的介绍 ...
- 程序设计 之 C#实现《拼图游戏》
功能描述: 1.用户自定义上传图片 2.游戏难度选择:简单(3*3).一般(5*5).困难(9*9)三个级别 3.纪录完成步数 模块: 1.拼图类 2.配置类 3.游戏菜单窗口 4.游戏运行窗口 -- ...
- 删除 vim 命令
x 删除当前光标下的字符dw 删除光标之后的单词剩余部分.d$ 删除光标之后的该行剩余部分.dd 删除当前行. c 功能和d相同,区别在于完成删除操作后进入INSERT MODEcc 也是删除当前行, ...
- sublime-text-3设置输入中文方法
sublime-text-3 编辑器性感而敏捷,却让人感慨有其长必有其短. 有些缺点都可以通过插件解决.但是要解决输入中文问题却很复杂,不能输入中文实在是太痛苦了. 我在做一个有很多文字的html页面 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介
日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...
- 学习vue 20天,我写了点东西
往昔 最初团队里使用Angularjs进行开发,刚开始还好,到了项目后期越发感觉Angularjs太重了,以至于后来重构项目时,毅然放弃Angularjs,投入了Vue的怀抱.除了组建团队时,是我搭建 ...
- 软件工程工具学习(1)---Visio
要给15级软件工程上机了.开个系列记录软件工程开发过程中所会用到的一些工具的学习. 第一篇---软件分析与设计工具 Microsoft Visio Visio 介绍 1.Visio是一款矢量图形与图标 ...