前言:
  // 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 的其他存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能意味着停止读取。
 
 
       MyISAM:
  MyISAM 的锁级别,不像 InnerDB 支持到行级锁,它只支持到表级锁,同时 MyISAM 不支持事务,
  没有了解过的同学,不要在你执行了 Back 操作后一脸懵逼的问,明明回滚了为什么数据还是被提交了。
 
  很早看过一篇关于 MySQL 存储引擎的如何做选择的文章,笔者对 InnerDB 和 MyISAM 分别做了读写的性能对比,
  毫无疑问,MyISAM 的读写操作是高于 InnerDB 的,但是 MyISAM 也有很多的弊端,所以在选择时,应根据业务的需要作出决策,
  否则出了问题,也会是坑了队友。如一些日志表,就可以直接选择 MyISAM。
     
  MyISAM 不支持热备份,但是可以手工或者自动执行检查和修复操作,但这里说的修复和事务恢复以及崩溃恢复是不同的概念。执
  行表的修复可能导致一些数据丢失,而且 修复操作是非常慢的。
 
五、如何选择合适的存储引擎
 
  总结一句话:除非需要用到某些 InnerDB 不具备的特性,并且没有其他办法可以代替,否则应该优先选择 InnerDB 存储引擎;
  // 不是非常特殊的情况,不要混合使用多种存储引擎;
 
  不要轻易相信“MyISAM 比 InnerDB 快”之类的经验之谈,这个结论往往不是绝对的。
  在很多我们已知的场景中,InnerDB 的速度都可以让 MyISAM 望尘莫及了,尤其是使用到聚簇索引,
  或者需要访问的数据可以放入内存应用。

MySQL 基础知识(基本架构、存储引擎差异)的更多相关文章

  1. 有评论就是我最大的动力~MySQL基础篇完结(存储引擎和图形化管理工具)

    hi 今天登上来,发现竟然有了3个评论~~加油吧! 这周的计划其实远远没有达到,然后下周还有一大堆事情...那么...周末好好玩吧~ 今天试图完结MySQL的基础篇知识,小白变为大白? 1.MySQL ...

  2. mysql基础(三)存储引擎和锁

    存储引擎的概念: 关系型数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,各种各样,不同的表结构意味着存储不同类型的数据,在数据的处理上也会存在着差异,对于mysql来说,它提 ...

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

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

  4. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

  5. MySql(十一):MySQL性能调优——常用存储引擎优化

    一.前言 MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.本章将介绍最为常用的两种存储引擎进行针对性的优化建议. 二.MyISAM存储 ...

  6. mysql-介绍、MySQL部署、数据类型、存储引擎

    数据库介绍  什么是数据? 数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材.数据是信息的表现形式和载体,可以是符号.文字.数字.语音.图像.视频等. ...

  7. 《MySQL技术内幕:InnoDB存储引擎(第2版)》书摘

    MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子中使用了mysqld_safe命令来启动数据库,当然启动MySQL实例的方 ...

  8. mysql基础知识语法汇总整理(一)

    mysql基础知识语法汇总整理(二)   连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...

  9. [MySQL Reference Manual]15. 其他存储引擎

    15. 其他存储引擎 15. 其他存储引擎 15.1 设置存储引擎 15.2 MyISAM存储引擎 15.2.1 MyISAM启动选项 15.2.2 Key的空间要求 15.2.3 MyISAM表存储 ...

  10. 数据库 MySQL 之 表操作、存储引擎

    数据库 MySQL 之 表操作.存储引擎 浏览目录 创建(复制) 删除 修改 查询 存储引擎介绍 一.创建(复制) 1.语法: 1 2 3 4 5 CREATE TABLE 表名(     字段名1 ...

随机推荐

  1. pmd 使用笔记

    pmd是一块开源的代码静态分析工具,使用java编写,可以自定义规则来进行自己想要的分析.pmd可以单独使用,也可以作为idea.eclipse的插件使用.它的规则分为xpath规则,和java规则. ...

  2. vuejs组件通信

    <body> <div id="example"> <father></father> </div> </body ...

  3. npm-folders

    npm-folders Executable(可执行程序) 在全局模式下,可执行程序被链接到Unix的{prefix}/bin目录下,或者是Windows的{prefix}目录下. 在本地模式下,可执 ...

  4. Excel 查找某一列中包含指定字符的单元格

    网上查找相关内容,个人感觉是另一种形式的过滤喽.有的说用FIND,有的用高级筛选.我查找时如下: 1.新拉一列,标注公式“=ISNUMBER(FIND("宣",B2))”,然后拉至 ...

  5. java.lang.NoClassDefFoundError: org/springframework/expression/PropertyAccessor

    这个异常原因种类不一,网上有各个版本,本人的是因为缺少了spring-expression-3.2.1.RELEASE.jar 2015-9-18 23:19:11 org.apache.catali ...

  6. spark学习(1)--ubuntu14.04集群搭建、配置(jdk)

    环境:ubuntu14.04 jdk-8u161-linux-x64.tar.gz 1.文本模式桌面模式切换 ctrl+alt+F6 切换到文本模式 ctrl + alt +F7 /输入命令start ...

  7. PHP 实现Session入库/存入redis

    对于大访问量的站点使用默认的Session 并不合适,我们可以将其存入数据库.或者使用Redis KEY-VALUE数据存储方案 首先新建一个session表 CREATE TABLE `sessio ...

  8. 013_HDFS文件合并上传putmarge功能(类似于hadoop fs -getmerge)

    场景 合并小文件,存放到HDFS上.例如,当需要分析来自许多服务器的Apache日志时,各个日志文件可能比较小,然而Hadoop更合适处理大文件,效率会更高,此时就需要合并分散的文件.如果先将所有文件 ...

  9. python的语法错误总结

    1.keyerror一般是你使用字典里不存在的key产生的错误. 2.TypeError一般是使用的数据类型不符合要求 join函数要求a都是string

  10. library-type:fr-unstanded vs fisrt-stand vs second-stanrd

    建库时是否是链特异性建库. Tophat2: --library-type The default is unstranded (fr-unstranded). If either fr-firsts ...