高性能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版本的新特性,也讲述了关于固态盘.高可扩展性设 ...
随机推荐
- iOS应用的几个阶段
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...
- MySQL学习笔记(一)—数据库基础
一.数据库概述 1.数据库的组织结构 (1)数据库就是用来存放信息的仓库. (2)数据库里的数据集合都存放在数据表(table)里. (3)数据表由数据行(row)和数据 ...
- ArcGIS API for JavaScript 4.2学习笔记[30] 点和线高程查询(第八章完结)
终于到最后一篇了,可喜可贺. 本例先说明了如何进行单点的高程差分析,然后说明了道路的起伏分析.前者很直观地比较了两个年份的高程数据之间的差值,体现山区的高程变化(有啥用啊?)后者,一条路上的起点终点起 ...
- .NET遇上Docker - 使用Docker Compose组织Ngnix和.NETCore运行
本文工具准备: Docker for Windows Visual Studio 2015 与 Visual Studio Tools for Docker 或 Visual Studio 2017 ...
- 3.QT5.8支持中文输入法(附带老版本的解决+不理想的情况解决)
安装过程:http://www.cnblogs.com/dotnetcrazy/p/6725945.html 用了QT发现,中文输入法不能输入...一开始以为是输入法问题,后来发现,其他地方都可以中文 ...
- JS中substring与substr的区别
Substring: 该方法可以有一个参数也可以有两个参数. (1) 一个参数: 示例: var str=“Olive”: str.substring(3); 结果:“ve” 说明:当substri ...
- lua 字符串
lua 字符串 语法 单引号 双引号 "[[字符串]]" 示例程序 local name1 = 'liao1' local name2 = "liao2" lo ...
- [JavaWeb]SpringSecurity-OAuth2.0 统一认证、资源分离的配置,用于分布式架构、模块化开发的认证体系
前言 关于 OAuth2.0的认证体系,翻阅了好多资料,RCF 文档太多,看了一半就看不下去了,毕竟全英文的文档看起来,是有一点让我烦躁,但也对 OAuth2.0的认证流程有了一个基本的概念,之前用 ...
- C#小知识点记录,对象的深拷贝
在CSDN中的定义是: public static string CompareExchange( ref string location1, string value, string compara ...