前言:
// MySQL 并发、异步IO、进程劫持
最近在看高性能 MySQL,记录写学习笔记:
高性能 MySQL 学习笔记(一) 架构与历史
笔记核心内容:MySQL 服务器基础架构、各种存储引擎之间的主要区别,以及这些区别的重要性;

一、MySQL 逻辑架构
如图:

第一层架构图:
也就是最上层的服务并不是 MySQL 独有的,大多数基于网络的客户端/服务器的工具或者服务器都有类似的架构,比如链接处理,授权认证,安全等等 ;
    // 每个客户端连接都会在服务器进程中拥有一个线程这连接查询只会在单独的线程中执行,线程只能轮流在某个 CPU 核心或者 CPU 中运行。
    // 客户端(应用)连接到 MySQL 时,MySQL 服务会对其连接做一些列的身份认证(例如用户名密码、权限控制等)
    // 这也回答了许多开发人员在使用数据库时,盲目的开关连接,甚至不关闭连接给 MySQL 服务器带来的损耗;
第二层架构:
MySQL 核心服务和功能都在这一层,包括查询解释,分析,优化,缓存以及所有的内置函数(例如,日期,时间,数学和加密函数),
所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等。
    // 查询解释:理解解析,将 SQL 的语句转换成 MySQL 内部数据结构(解析树)
    // 分析:对语法的分析,是否存在语法错误;
    // 优化:这是一个非常重的课题,还没有深入到这里来,大体了解意思为:将需要执行的 SQL 语句进行优化处理,如 where 条件后的顺序等;
    // 内置函数:注意是内置,也可以自定义;但是不建议在 MySQL 上做这些操作,记住数据库只是用来存储数据的,数据库的性能空间留给 CRUD
    // 后面章节对 MySQL 优化器单独分析

第三层架构:
包含了存储引擎,存储引擎负责MySql中数据的存储和提取,和GNU/Linux写的各个文件系统一样,每个存储引擎都有它的优势和劣势,
服务器通过API与存储引擎进行通信,这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对于上层的查询过程透明,
存储引擎 API 包含十几个底层函数,用于执行诸如 '开始一个事务'或者'根据主键提取一行记录‘等操作,
但存储引擎并不会去解析 SQL,不同存储引擎之间也不会相互通信,而只是简单的响应上层服务器的请求。
二、MySQL 并发控制
并发:多条语句同时执行时,就会出现并发问题;
控制并发且不出现数据错误等问题,就取决于数据库系统如何在锁上如何设计的了。
MySQL 只一种可以支持到行级锁的数据库。MySQL 锁分为:表锁、行锁;
  // update t_users set login_count = 0 where 1 = 1;          # 产生一个表级锁
  // update t_users set age = 18 where id = 9527;              # 产生一个行级锁
每种 MySQL 存储引擎都可以实现自己的锁策略和锁粒度。
  // 锁策略:所谓的锁策略,就是在锁的开销和数据的安全性之间寻求平衡,这种平衡直接与性能挂钩;
  // 锁粒度:一种提高共享资源并发性的方式,让锁定的对象更有选择性。 
  // 锁定的数据量越小,则系统支撑的并发数量越高。
三、死锁
死锁是指两个或者多个事务(注意哈,一个单条的 update 语句其实本质上也是一个事务)在同一资源上互相占用,
并请求锁定对方占用的资源,从而导致的恶性死循环的现象。
// 不过注解,理解为两个人在互相等待;
MySQL 数据库在死锁现象上,实现了各种死锁检测和死锁超时的机制,
比如 InnerDB 存储引擎,它能检测到死锁的循环依赖,并立即返回一个错误。
四、存储引擎
存储引擎重点学习两个(InnerDB、MyISAM):

  // 其他存储引擎用的很少,MySQL 官方也提供了一些 API,有很多爱好者在此基础上自己实现了许多存储引擎,
          喜欢深挖的,可以去看看;

InnerDB:
事务型存储引擎,作为 MySQL 默认的存储引擎,应该说是在 MySQL 4.0 + 以后的版本推出来的。
他被设计用来处理大量的短期事务,短期事务大部分情况是正常提交的,很少会被回滚。
  InnoDB的性能和自动崩溃恢复特性,使得他在非事务型存储的需求中也很流行,
  除非有非常特别的原因需要使用其他的存储引擎,否则应该有限考虑InnoDB引擎。
InnoDB 的数据存储在表空间,表空间由InnoDB管理的一个黑盒子,由一系列的数据文件组成。
InnoDB 可以将每个表的数据和索引存放在单独的文件中。
InnoDB 也可以使用裸设备作为表空间的存储介质,但现在的文件系统是的裸设备不再是必要的选择。
InnoDB 采用 MVCC 支持高并发,并且实现了四个标准的隔离级别。
其默认级别是 REPEATABLE READ,并且通过间隙锁策略防止幻读的出现,
间隙锁是的InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻行的插入。
InnoDB内部做了很多就花,包含从磁盘读取数据时采用的可预测性预读,
能够自动在内存中创建hash索引以加速读操作的自适应哈希索引,以及能够加速插入操作的插入缓存等。
作为事务型的存储引擎,InnoDB通过一些机制和工具支持真正的热备份,
Oracle 提供的MySql Enterprise Backup , Percona提供的开源的XtraBackup都可以做到这一点。
  MySQL 的其他存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能意味着停止读取。
// 技术深度:http://blog.csdn.net/cd520yy/article/details/8541422   

MyISAM:
MyISAM 的锁级别,不像 InnerDB 支持到行级锁,它只支持到表级锁,同时 MyISAM 不支持事务,
没有了解过的同学,不要在你执行了 Back 操作后一脸懵逼的问,明明回滚了为什么数据还是被提交了。
  很早看过一篇关于 MySQL 存储引擎的如何做选择的文章,笔者对 InnerDB 和 MyISAM 分别做了读写的性能对比,
  毫无疑问,MyISAM 的读写操作是高于 InnerDB 的,但是 MyISAM 也有很多的弊端,所以在选择时,应根据业务的需要作出决策,
  否则出了问题,也会是坑了队友。如一些日志表,就可以直接选择 MyISAM。
MyISAM 不支持热备份,但是可以手工或者自动执行检查和修复操作,但这里说的修复和事务恢复以及崩溃恢复是不同的概念。执
行表的修复可能导致一些数据丢失,而且 修复操作是非常慢的。

五、如何选择合适的存储引擎
总结一句话:除非需要用到某些 InnerDB 不具备的特性,并且没有其他办法可以代替,否则应该优先选择 InnerDB 存储引擎;
// 不是非常特殊的情况,不要混合使用多种存储引擎;
不要轻易相信“MyISAM 比 InnerDB 快”之类的经验之谈,这个结论往往不是绝对的。
在很多我们已知的场景中,InnerDB 的速度都可以让 MyISAM 望尘莫及了,尤其是使用到聚簇索引,
或者需要访问的数据可以放入内存应用。

转载于:https://www.cnblogs.com/loongsoft/p/7278322.html

MySQL 基础知识(基本架构、存储引擎差异)相关推荐

  1. Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型

    1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结 ...

  2. MySql基础知识、存储引擎与常用数据类型

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文将主要讲解了数据库的一些基础知识,介绍了MySql的存储引擎,最后讲了MySql常用的数据 ...

  3. 50 个 Redis 必备知识:基础知识,架构、调优和监控知识及难点解决

    本文包括:30 个 Redis 基础知识:10个 Redis 架构和运维必懂的知识:Redis 调优.监控知识和10个具体应用难点. 30 个 Redis 基础知识 1.Redis支持哪几种数据类型? ...

  4. MySQL工作中的实际用_总结工作中经常用到的mysql基础知识

    总结工作中经常用到的mysql基础知识 发布时间:2020-06-08 11:27:30 来源:51CTO 阅读:217 作者:三月 本文主要给大家介绍工作中经常用到的mysql基础知识,文章内容都是 ...

  5. MySQL——基础知识

    目录 一.SQL组成 1)数据定义语言(Data Definition Language,DDL) 2)数据操作语言(Data Manipulation Language,DML) 3)数据查询语言( ...

  6. MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物

    MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...

  7. MySql基础知识【一】

    Mysql基础知识 1. MySql是什么 2. 数据库设计的三大范式 2.1. 第一范式 2.2. 第二范式 2.3. 第三范式 3. Binlog的三种模式 3.1 Statement模式(默认) ...

  8. 《MySQL技术内幕:InnoDB存储引擎》第2版笔记

    第1章 MySQL体系结构和存储引擎 1.1 定义数据库和实例 在MySQL数据库中,数据库文件可以是fm.MYD.MYI.ibd结尾的文件. MySQL数据库由后台线程以及一个共享内存区组成. My ...

  9. 2.MySQL 基础知识

    文章目录 MySQL 基础知识 知识点一 : MySQL命令行常用命令 知识点二 : 持久化 相关概念 知识点三 : 数据库 相关概念 知识点四 : DB 和 DBMS 关系图示 知识点五 : MyS ...

  10. mysql+连接每一行数据_MySQL_深入mysql基础知识的详解,1.每个客户端连接都会从服务 - phpStudy...

    深入mysql基础知识的详解 1.每个客户端连接都会从服务器进程中分到一个属于它的线程.而该连接的相应查询都都会通过该线程处理. 2.服务器会缓存线程.因此并不会为每个新连接创建或者销毁线程. 3.当 ...

最新文章

  1. oracle oud什么意思,oracle 在linux上,如何使用oud工具恢復truncate 表中的记录? 超急!请帮帮忙...
  2. 刚刚,2021泰晤士高等教育亚洲大学排名出炉
  3. Faster R-CNN教程
  4. Counterfeit Dollar
  5. 【Ubuntu-Opencv】Ubuntu14.04 Opencv3.3.0 使用中出现OpenCV Error: Unspecified error
  6. 为什么现在老师这么难,值得大家深思
  7. 智慧交通day02-车流量检测实现01:总览
  8. 处理血压信号_测血压检测健康,8款高品质血压计推荐
  9. 预充电电路工作原理_变频器整流回路 为什么要预充电电路-工业支持中心-西门子中国...
  10. cv2.imshow无法正常显示图片,而是一闪而过解决办法
  11. matlab中abs( )函数
  12. StaMPS结合TRIAN 做GACOS大气校正
  13. php 进程通信系列 (三)信号量
  14. 计算机应用技术专业硕士学位,南华大学计算机应用技术专业硕士学位研究生培养方案...
  15. 一位8421BCD码转5421码,2421码,余3码组合电路(附思路)
  16. java 超市收银_java-超市收银系统
  17. Docker Compose 容器编排基础使用
  18. Byte 高位/低位简介绍(大端格式/小端格式)
  19. Scala与Java语言的差异
  20. C#中 out的使用

热门文章

  1. 【opencv学习】【图像的数值计算操作】
  2. 图像语义分割 -- FCN
  3. 漫步最优化四——约束
  4. tf.keras.layers.Attention 理解总结
  5. 【图像处理】Qt+OpenCV自制mini软件——图像二值化器
  6. leetcode —— 337. 打家劫舍 III
  7. 吴恩达深度学习 —— 2.9 逻辑回归中的梯度下降法
  8. Java多线程网络爬虫(时光网为例)
  9. Multi_thread--Linux下多线程编程中信号量介绍及简单使用
  10. 如何将不规整的dataframe中特定的值去掉