此文已由作者朱笑天授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

笔者在工作之余阅读了一下高性能mysql,以下的内容对mysql的介绍以及书中涉及一些概念的总结归纳。

1.mysql架构

1.最上层负责链接处理、认证授权、安全等

2.中间一层涵盖了mysql的大多数核心功能。包括查询解析、分析、优化、缓存、内置函数;所有的夸存储引擎的功能都在这一层实现(存储过程、触发器、视图等)

3.第三层包含了存储引擎,存储引擎与上层使用API进行通讯,引擎之间不会有交互。

1.1连接层

当MySQL启动,等待客户端连接,每一个客户端连接请求,服务器都会新建一个线程处理,每个线程独立,拥有各自的内存处理空间。

a.连接处理流程

b.认证流程

连接到服务器,服务器需要对其进行验证,也就是用户名、IP、密码验证,一旦连接成功,还要验证是否具有执行某个特定查询的权限。

1.2sql处理层

这一层主要功能有:SQL语句的解析、优化,缓存的查询,MySQL内置函数的实现,跨存储引擎功能,例如:存储过程、触发器、视图等。

a.执行过程:

1.如果是查询语句(select语句),首先会查询缓存是否已有相应结果,有则返回结果,无则进行下一步(如果不是查询语句,同样调到下一步); 
2.解析查询,创建一个内部数据结构(解析树),这个解析树主要用来SQL语句的语义与语法解析;
3.优化:优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等。这一阶段用户是可以查询的,查询服务器优化器是如何进行优化的,便于用户重构查询和修改相关配置,达到最优化。这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作的开销信息、是否对特定索引有查询优化等。

1.3 存储引擎

存储引擎,主要用来存储数据的,不同的存储引擎采用不同的技术(存储机制、索引机制、锁定机制)存储数据,这主要是为了满足数据存储要求,比如有的数据不需要大量的改动,只用来查询,而有的数据则需要常常修改(数据插入、删除、更新),针对各种业务情况,为了更好的数据处理效率采用不同的数据存储技术(即不同存储引擎)。 
  MySQL的存储引擎是插件式的,也就是说,用户可以随时切换MySQL的存储引擎:针对表或针对库都可(通过SQL语句命令)。这种灵活性也是为什么MySQL受到欢迎的一个重要原因。MySQL集合了多种引擎:MyISAM、InnoDB、BDB、Merge、Memory等,默认的是InnoDB(MySQL5.5开始,以前是MyISAM)。

2.并发控制

MySQL是多线程应用,并且共享存储数据,很显然,当两个及以上线程对同一块数据进行写将会发生数据不一致等各种问题,比如,同时对一个表增加一条记录,后一个增加的记录可能会覆盖前一条,造成数据丢失。若仅仅是读不会发生错误,但是当读写一同,就有可能发生读错误,所以,对读也是需要必要的控制。

以上问题就需要并发控制来解决,所谓的并发,就是每一次只允许一个线程对某一块数据(可以是某个数据库,或某张表,或表里某条记录)写,实现并发控制有多种方式,MySQL采用的是锁以及MVCC(多版本控制)。

a.读写锁

MySQL提供了两种锁实现并发控制:读锁和写锁。读锁是共享的,也叫共享锁(也叫S锁),相互不会阻塞,多个读锁(多个线程用户)可以同一时刻读取统一资源;写锁则是排他的,也叫排他锁(也叫X锁),同一时间一个资源只能有一个写锁,也就是说,写锁会阻塞其他写锁和读锁。即读锁上面可以加读锁,但不能加写锁,而写锁则不能加任何锁。

  每次操作数据先判断该数据是否加锁,加了什么锁,然后以此判断是否允许本次操作执行,但这样是不是觉得很麻烦?很耗性能?所以才有了数据库事务隔离级别,统一设置一个隔离级别,数据库系统会根据隔离级别隐式的给数据加锁,然后根据这个级别来判断本次操作执行权限。

b.乐观锁悲观锁

悲观锁:操作前,悲观地认为所操作数据在操作期间会被其他事务修改,所以,在操作前我要先给我操作的数据加锁才放心。至于加的是读锁还是写锁则看具体应用场景。

 乐观锁:操作前,乐观地认为所操作数据在操作期间不会被其他事务修改,只在最后更新的时候(如果操作是更新的话)查看原始数据是否被修改,如果没修改,更新数据,否则失败。至于如何知道原始数据被修改,这就是涉及到具体实现方式了,最常用的就是MVCC。

理论上,尽量锁定需要修改的部分,而不是所有的数据,锁定的数据单元越小,系统的并发控制度越高,比如行级锁,修改的时候只锁定这一行记录,这个时候其他线程对该表的其他记录修改不影响。但是,加锁也是需要消耗资源的,锁的各种操作:获得锁、检查锁状态、释放锁等都会增加开销,越细粒度的锁开销越大,过多的所操作所带来的是性能急剧下降。

 所以我们要采用一种锁策略来平衡并发度和系统性能,MySQL由于存储引擎的插件式,每个存储引擎可以实现自己的锁策略,所以不需要通用的锁策略,只需要在相应应用场景下选择相应的存储引擎即可。

表锁:

MySQL最基本的锁策略,顾名思义,对整张表加读锁和写锁。一般由MySQL服务器层实现,如果这个时候存储引擎层还有锁,优先表锁。

行级锁:

 更大细粒度的锁,只锁住一行记录,即对不同行记录可并发操作。行级锁只由存储引擎层实现,MySQL服务器层没有实现。

3.事务

一个实现了事务处理系统(保证事务的ACID)的数据库,相比没有实现的,需要更强的CPU处理能力、更大的内存和更多的存储空间,但是有些场景是不太需要事务处理能力的,也就不需要具有事务处理能力的数据库(因为他们需要更大的资源)。

MySQL中InnoDB、NDB cluster存储引擎实现了事务功能,当然还有其他第三方存储引擎也实现了,默认下采用自动提交模式,即若不显式开始一个事务,每一个操作当做一个事务进行操作,可以通过设置AUTOCOMMIT变量来启用或禁用自动提交模式,如果禁用了则需显式执行COMMIT或ROLLBACK结束事务。

下面针对connection_type值的不同做的一些实验:

create table test(a int, primary key (a))engine=innodb;

set @@completion_type=1;

begin;

insert into test select 1;

commit work;

insert into test select 2;

insert into test select 2;

rollback;

得到如下结果:

测试中,将completion_type设置成1,第一次通过commit work来insert这条记录。之后insert 2的时候并没有启用begin(start transaction)来开启一个事务,之后再插入一条重复的记录2,这时会抛出异常rollback后,最后发现只有1这样一条记录,2并没有被insert进去。因为completion_type为1的时候,commit work会开启另外一个事务,因此2个insert语句是在同一个事务里面的,所以回滚后就没有insert进去。

set @@completion_type=2;

begin;

insert into test select 3;

commit work;

select @@versison;

通过上面的测试发现,completion_type设置成2时,commit work之后,再通过select获取db服务器版本信息的时候出现2006的error,说明以及断开了与db的连接。

参数completion_type为2时,commit work等同于commit and release。当事务提交时候会自动断开与db的连接。

待续。。。

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 当Shell遇上了NodeJS

高性能mysql学习笔记的更多相关文章

  1. 高性能MySql学习笔记——锁、事务、隔离级别(转)

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

  2. 高性能Mysql学习笔记之事务

    传送门 什么是事务? 事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就会执行该组查询.如果其中有任何一条语句因为崩溃或其他原因无 ...

  3. 第13章 MySQL服务器的状态--高性能MySQL学习笔记

    13.1 系统变量 -- 服务器配置变量 MySQL通过SHOW VARIABLES  SQL命令显示许多系统变量. 13.2 状态变量--SHOW STATUS SHOW STATUS 命令会在一个 ...

  4. MySQL学习笔记-cache 与 buffer

    Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而 buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出的数据,后者是解决写 ...

  5. MySQL学习笔记-大纲

    软件程序性能测试在之前<品味性能之道>系列中已经大量提到,讲解了很多测试方法.测试观念.测试思想等等.最近准备深入MySQL进行学习并总结.分别查阅<MySQL性能调优与架构设计&g ...

  6. Mysql学习笔记(三)对表数据的增删改查。

    正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...

  7. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  8. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

  9. Mysql学习笔记(一)数据类型

    原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m ...

随机推荐

  1. iOS - swift项目接入bugly - 报错, 配置符号表,下载Java环境,

    1.pod 安装,无需配置任何东西 2.终端找到路径: pod install 3.在 appdelegate 导入  import Bugly extension AppDelegate{ /// ...

  2. 18-从n个数中选m个

    #include <iostream>using namespace std; int f(int n, int m){        if(n < m)         //这个条 ...

  3. Django之virtualenv下安装xadmin

    1.安装xadmin,通过pip 进入virtualenv pip安装xadmin pyyuc:~ yuchao$ source PycharmProjects/mxvenv/bin/activate ...

  4. SSH登录到远程linux机器并执行命令

    一. 1.JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成 ...

  5. UI小白如何快速提升自己

    作为一名经历过UI学习的过来人,这些观点是自己在整个学习的过程中总结的. 希望可以对大家有所帮助,可以让刚开始接触UI的人少走弯路吧,话不多说. 快速进入主题. ​ 那么UI小白到底如何快速提成自己呢 ...

  6. Plugin 'Scala' is incompatible with this.installation

    ==问题=== 手动安装IDEA的Scala插件,报这个错误. ===原因=== IDEA的版本与Scala插件的版本不兼容. ===解决=== 1.查看一下IDEA的版本 2.下载对应版本的Scal ...

  7. org.hibernate.HibernateException: /hibernate.cfg.xml not found等三个问题

    初次配置hibernate在myeclipse上: 出现三个问题,怎么都不好使,比对代码,没有问题,查看路径还是没有问题: 1.org.hibernate.HibernateException: /h ...

  8. 获取iOS 设备上崩溃日志 (Crash Log)的方法

    1. iTunes同步获取 大部分用户会使用iTunes软件来管理iPhone,这样同步的Crash日志就会同步到电脑上,我们需要在特定的路径里面查找 Mac OS X:~/Library/Logs/ ...

  9. 20155231 2016-2017-2 《Java程序设计》第9周学习总结

    20155231 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章:整合数据库 Metadata即"诠读数据的数据",数据库是用来 ...

  10. HDU2553 N皇后问题 2016-07-24 13:56 283人阅读 评论(0) 收藏

    N皇后问题 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是, ...