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

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

笔者在工作之余阅读了一下高性能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. java和数据结构的面试考点

    目标:不要有主要的逻辑错误.2遍以内bug free.注意代码风格 不要让面试官觉得不懂规矩 Java vs C++ Abstract class vs interface  pass by refe ...

  2. ios 工具大全,最全框架

    https://www.jianshu.com/p/e280f3348156 [链接]文件分享 - 网盘分享https://share.weiyun.com/5A1aura

  3. c语言使用指针实现模拟java/c# string.concat字符串串联方法

    #include <stdio.h> void _strcat(char *, const char *); int main(void) { char source[] ="V ...

  4. c++ 中的符号与关键字

    符号按照符号的ASC码数值从小到达排列,关键字按照英文字母排序. & [38] 位运算:取地址:左值引用[指针.引用都是可以做类型转换的] #include <iostream> ...

  5. 解决 Ubuntu 下 sudo 命令执行速度慢的问题

    1.首先如果当用登录的用户名不在"/etc/sudoers"文件中,是不能执行sudo命令的.可以用root身份手动修该文件,把当前登录用户名加入该文件中. 2.用"ho ...

  6. Java中的内存划分

    Java程序在运行时,需要在内存中分配空间.为了提高运行效率,就对数据进行了不同的空间划分.因为每一片区域都有特定的数据处理方式和内存管理方式. 具体分为5种内存空间: 程序计数器:保证线程切换后能恢 ...

  7. Windows游戏找不到了怎么办?

         大家有的时候,可能是不慎操作,或是某些新装的Windows,会发现那些经典的游戏不见了,那它们去哪了呢?是长腿跑了?还是Windows偷工减料?都不是,让巩固来教你们把他们找出来! 1.在开 ...

  8. 2018.09.09 bzoj3505: [Cqoi2014]数三角形(容斥原理+简单计数)

    传送门 正难则反. 可以直接把问题转化成求出三点共线的情况数量. 如果同在一排或一列显然可以直接算,关键是如何求出斜着的. 我们知道,对于一个整点矩形. 如果长为x,宽为y,那么这个矩形任意一条对角线 ...

  9. AVL树C++实现

    1. AVL 树本质上还是一棵二叉搜索树,它的特点是: 本身首先是一棵二叉搜索树. 带有平衡条件: 每个结点的左右子树的高度之差的绝对值(平衡因子) 最多为 1. 2. 数据结构定义 AVL树节点类: ...

  10. python小练习--函数调用函数,让对象具有能动性

    class Box:#定义一个类名为Box,类名后不必有括号,类包含类属性和类方法,这个类没有定义类属性 '''这是一个计算体积的类'''#这是这个类的__doc__属性,执行类后就可以在交互界面输入 ...