高性能MySQL学习笔记(1) —— MySQL架构
MySQL架构
1.MySQL逻辑架构:
这里分为三层:
1.连接层:连接与线程处理,这一层并不是MySQL独有,一般的基于C/S架构的都有类似组件,比如连接处理、授权认证、安全等。
2.SQL处理层:也叫MySQL服务器层,包括缓存查询、解析器、优化器,这一部分是MySQL核心功能,包括解析、优化SQL语句,查询缓存目录,内置函数(日期、时间、加密等函数)的实现
3.数据存储层:也叫存储引擎层,负责数据存储,存储引擎的不同,存储方式、数据格式、提取方式等都不相同,这一部分也是很大影响数据存储与提取的性能的。但是,与分层的思想一致,SQL处理层是通过API与存储引擎通信的,API屏蔽了下层的差异,下层提供对外接口,上层负责调用即可,不必清楚下层是怎么实现的。
客户端说明:MySQL是基于C/S架构的,这里的客户端自然是专门的,能访问到MySQL服务器的,主要有这么几类,操作客户端:单纯的操作MySQL服务器中的数据(这里数据包括库、表、索引、表中数据等),比如常用的native、phpMyAdmin、Sequal Pro等;应用客户端:应用程序通过程序访问数据库,比如JDBC、ODBC、PHP程序、python程序等。不管是哪种,其实最后都转换为SQL语句访问MySQL。
1.连接层
当MySQL启动(MySQL服务器就是一个进程),等待客户端连接,每一个客户端连接请求,服务器都会新建一个线程处理(如果是线程池的话,则是分配一个空的线程),每个线程独立,拥有各自的内存处理空间,但是,如果这个请求只是查询,没关系,但是若是修改数据,很显然,当两个线程修改同一块内存是会引发数据同步问题的。
>连接处理流程
连接到服务器,服务器需要对其进行验证,也就是用户名、IP、密码验证,一旦连接成功,还要验证是否具有执行某个特定查询的权限(例如,是否允许客户端对某个数据库某个表的某个操作)。
>认证流程
2.SQL处理层
这一层主要功能有:SQL语句的解析、优化,缓存的查询,MySQL内置函数的实现,跨存储引擎功能(所谓跨存储引擎就是说每个引擎都需提供的功能(引擎需对外提供接口)),例如:存储过程、触发器、视图等。
>执行过程:
(图中的查询并不是一定是select语句,在MySQL中,一般习惯把每一条SQL命令称为query(查询))
1.如果是查询语句(select语句),首先会查询缓存是否已有相应结果,有则返回结果,无则进行下一步(如果不是查询语句,同样调到下一步);
2.解析查询,创建一个内部数据结构(解析树),这个解析树主要用来SQL语句的语义与语法解析;详情可查看:MySQL解析器。
3.优化:优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等。这一阶段用户是可以查询的,查询服务器优化器是如何进行优化的,便于用户重构查询和修改相关配置,达到最优化。这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作的开销信息、是否对特定索引有查询优化等。详情可查看:MySQL优化器。
3.存储引擎
存储引擎,也称为表类型,主要用来存储数据的,不同的存储引擎采用不同的技术(存储机制、索引机制、锁定机制)存储数据,这主要是为了满足数据存储要求,比如有的数据不需要大量的改动,只用来查询,而有的数据则需要常常修改(数据插入、删除、更新),针对各种业务情况,为了更好的数据处理效率采用不同的数据存储技术(即不同存储引擎)。
MySQL的存储引擎是插件式的,也就是说,用户可以随时切换MySQL的存储引擎:针对表或针对库都可(通过SQL语句命令)。这种灵活性也是为什么MySQL受到欢迎的一个重要原因。MySQL集合了多种引擎:MyISAM、InnoDB、BDB、Merge、Memory等,默认的是InnoDB(MySQL5.5开始,以前是MyISAM)。
2.MySQL物理组件
以下主要参考文章:MySQL架构(guisu)。
以上组件是对逻辑架构的实现:
1.Management Services & Utilities
服务管理和控制组件,主要用来回滚操作、恢复数据、数据的复制、迁移、元数据的管理等。
2.Connection Pool:连接池
连接池,对应逻辑架构的连接层,主要用来管理用户连接,包括监听、接收客户端请求,转发请求到相应的线程管理模块(该模块负责维护这些线程,包括创建、线程cache,可有线程池实现),还有连接的权限认证工作。
3.SQL Interface:SQL接口
各种SQL接口,用来接收管理SQL命令,比如DML、DDL操作,存储过程,视图,触发器等。
4.Parser:解析器
SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。
主要功能:
a . 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的。
5.Optimizer: 查询优化器
优化SQL语句,比如常量转换与计算、无效代码排除、AND/OR等等优化。查询优化器必要的时候还会询问存储引擎,计算语句执行消耗,从而得出最优策略去执行该SQL命令。
6.Cache & Buffer: 查询缓存
他的主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做一个对应。该 Query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
7.存储引擎
目前只有MySQL实现了插件式多存储引擎(加了一层抽象层对接下面的存储数据层),其他数据库基本上使用单一的存储引擎。MySQL的存储引擎是基于表的,每个表可选择自己需要的存储引擎。
-
《高性能MySQL》学习笔记二
今天打算继续学习《高性能MySQL》的第四章,有关数据库的优化。Schema与数据类型优化前置知识:如何设计数据库? 关于这方面我是在CSDN博客上找文章看的。选择优化的数据类型三大原则:(简单、小...- u012723607
- 2017年08月09日 15:35
- 88
-
《高性能MySQL》读书笔记(上)
《High Performance MySQL》真是本经典好书,从应用层到数据库到硬件平台,各种调优技巧、常见问题全都有所提及。数据库的各种概念技巧平时都有接触,像索引、分区、Sharding等等,但...- dc_726
- 2014年12月06日 19:31
- 6233
-
-
2017年!全球AI人才薪酬报告出炉了!中国区AI人才最贵?
给大家分享下2017年AI程序员的人才报告,服了!薪酬最高的竟然不是谷歌!~
-
-
票选结果:Python再上天,微软要求全员学Python?
宇宙语言Python荣登年度排行榜,吴恩达,微软纷纷为它站台,Python这么牛逼的原因是....
-
-
票选结果:Python再上天,微软要求全员学Python?
宇宙语言Python荣登年度排行榜,吴恩达,微软纷纷为它站台,Python这么牛逼的原因是....
-
《高性能MySQL》读书笔记--多版本并发控制算法
InnoDB存储引擎MVCC的实现策略: 在每一行数据中额外保存两个隐藏的列:当前行创建时的版本号和删除时的版本号(可能为空)。这里的版本号并不是实际的时间值,而是系统版本号。每开始 个新的事务,系...- xifeijian
- 2015年04月25日 22:45
- 6740
-
-
Delphi7高级应用开发随书源码
- 2003年04月30日 00:00
- 676KB
- 下载
-
《高性能MySQL》读书笔记
《High Performance MySQL》真是本经典好书,从应用层到数据库到硬件平台,各种调优技巧、常见问题全都有所提及。数据库的各种概念技巧平时都有接触,像索引、分区、Sharding等等,但...- stark_summer
- 2015年09月28日 07:38
- 26401
-
socket阻塞与非阻塞,同步与异步
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步: 所谓...- xhjcehust
- 2015年01月16日 21:26
- 566
-
【学习笔记】高性能MySQL(第三版)——第1章:MySQL架构与历史
MySQL并不完美,却足够灵活,能够适应高要求的环境,例如Web类应用。同时,MySQL既可以嵌入到应用程序中,也可以支持数据仓库、内容索引和部署软件、高可用的冗余系统、在线事务处理系统(OLTP)等...- qq157962718
- 2016年03月28日 01:08
- 660
-
高性能MySQL学习笔记(2) —— 并发控制
MySQL 并发控制前一节已经说过了,MySQL是多线程应用,并且共享存储数据,很显然,当两个及以上线程对同一块数据进行写将会发生数据不一致等各种问题,比如,同时对一个表增加一条记录,后一个增加的记录...- a327369238
- 2016年09月29日 11:44
- 379
-
高性能MySQL学习笔记(4) —— 事务隔离级别
事务隔离级别事务的ACID属性中的隔离性,如何实现呢?在SQL标准中定义了四种隔离级别。 但要注意,标准中定义的这四个级别,在实际上各个存储引擎的实现是不尽相同的,有些细节地方还是不一样的,学习的时...- a327369238
- 2016年10月13日 16:40
- 373
-
高性能MySql学习笔记——锁、事务、隔离级别
为什么需要锁? 因为数据库要解决并发控制问题。在同一时刻,可能会有多个客户端对Table1.rown进行操作,比如有的在读取该行数据,其他的尝试去删除它。为了保证数据的一致性,数据库就要对这种并发操...- Sandeldeng
- 2016年10月17日 09:30
- 244
-
高性能MySql学习笔记——锁、事务、隔离级别
为什么需要锁? 因为数据库要解决并发控制问题。在同一时刻,可能会有多个客户端对Table1.rown进行操作,比如有的在读取该行数据,其他的尝试去删除它。为了保证数据的一致性,数据库就要对这种并...- zhaoliang831214
- 2016年05月17日 09:56
- 228
-
-
高性能mysql学习笔记
- 2016年06月22日 13:54
- 518KB
- 下载
-
-
Mysql高性能学习笔记02
- 2014年05月23日 22:12
- 247KB
- 下载
-
高性能MySQL(第二版)第三章 架构优化和索引(上)——读书笔记
一,选择优化的数据类型 更小通常更好 更小的数据类型使用了更少的磁盘,内存和CPU缓存 但是要确保不要低估需要保存的值,在架构中的多个地方增加数据类型的范围是一件极其费时...- very9527
- 2013年03月15日 09:22
- 746
-
【学习笔记】高性能MySQL(第三版)——第2章:MySQL基准测试
基准测试(benchmark)是MySQL新手和专家都需要掌握的一项基本技能。简单地说,基准测试是针对系统设计的一种压力测试。通常的目标是为了掌握系统的行为。但也有其他原因,如重现某个系统状态,或者做...- qq157962718
- 2016年03月28日 23:01
- 604
-
高性能MySQL读书笔记:1、MySQL架构与历史
MySQL逻辑架构 MySQL具有分层架构,上层是服务器层的查询和执行引擎下层是存储引擎。其中,服务器层又包含两层,第一层负责连接/线程处理、授权认证、安全,第二层负责查询解析、分析、优化、缓存以及...- zcy19941015
- 2016年12月20日 23:50
- 288
-
《高性能MySql》学习笔记 持续更新
1.尽量避免NULL 如果查询中包含可为NULL的列,对MySql来书更难优化。2.浮点类型 无论使用float还是double,MySql使用double作为内部浮点计算3.Decimal...- renpengddxx
- 2017年06月18日 17:07
- 122
-
【学习笔记】《高性能MYSQL》对性能优化定义
本文属于读书笔记,大部分内容摘抄于《高性能MYSQL》,摘抄内容版权属于原作者。 在《高性能mysql》中将西能定义为完成某件任务所需要的时间度量,换句话说,性能即响应时间。按照这个定义,我...- sinat_38232376
- 2017年04月08日 16:59
- 252
-
《高性能MySQL》学习笔记三
创建高性能的索引索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要,但不恰当的索引对性能的影响也会很大,所以创建高性能的索引很重要。索引基础什么是索引? 在...- u012723607
- 2017年08月09日 17:33
- 124
-
mysql高性能学习笔记整理
1.ACID 表示原子性,一致性,隔离性,持久性,一个运行良好的事物处理系统,必须具备这些特征。 原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中 所有的操作要么提交成功,要么全部提交...- u011156212
- 2014年02月28日 16:29
- 692



博主专栏
-
Java源码解析
11601


他的热门文章
- Java中float/double取值范围与精度
22452
- Spring Bean生命周期详解
6781
- Mac Charles乱码解决办法
6750
- Type Java类型
6432
- 4211