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

前言:

  // 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 望尘莫及了,尤其是使用到聚簇索引,

  或者需要访问的数据可以放入内存应用。

时间: 2024-08-02 19:13:25

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

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

存储引擎的概念: 关系型数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,各种各样,不同的表结构意味着存储不同类型的数据,在数据的处理上也会存在着差异,对于mysql来说,它提供了多种类型的存储引擎,可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用mysql的性能 mysql常见的存储引擎:(SHOW ENGINES;    查看mysql支持的存储引擎) InnoDB:mysql5.5以后默认使用的储存引擎,是目前使用最为广泛的存储引擎 InnoDB的特

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

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文将主要讲解了数据库的一些基础知识,介绍了MySql的存储引擎,最后讲了MySql常用的数据类型 1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结:数据永远是数据库的核心. 1.2.关系数据库管理系统 通过"数据库管理系统",数据

MySQL的四种主要存储引擎

在数据库中存的就是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库.而在设计表的时候,我们都会关注一个问题,使用什么存储引擎.等一下,存储引擎?什么是存储引擎? 什么是存储引擎? 关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式.有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差:而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,

MySQL教程详解之存储引擎介绍及默认引擎设置

什么是存储引擎? 与其他数据库例如Oracle 和SQL Server等数据库中只有一种存储引擎不同的是,MySQL有一个被称为“Pluggable Storage Engine Architecture”(可替换存储引擎架构)的特性,也就意味着MySQL数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎.MySQL数据库在实际的工作中其实分为了语句分析层和存储引擎层,其中语句分析层就主要负责与客户端完成连接并且事先分析出SQL

MySQL视图、存储过程与存储引擎

MySQL视图.存储过程与存储引擎 一.前言 ? 前面的文章已经介绍了MySQL的索引与事务以及MySQL的备份与恢复的相关的内容,本文将对MySQL视图及存储过程以及存储引擎进行讲述. 二.MySQL视图 2.1问题引出--视图的概念 ? 我们在使用SQL语句进行多表查询的时候的命令是非常冗长而麻烦的,如果说这样的操作还非常多的使用的情况下就会加大工作人员的工作量,毕竟不能保证如此长的代码不会写错,并且多次进行如此复杂的查询也会造成服务器资源占用比变大的问题,那么我们有什么好的办法解决这样的问

mysql基础知识之增删查改使用介绍

 mysql基础知识之增删查改使用介绍 本文主要介绍mysql常用的SELECT.INSERT.UPDATE.DELETE语句的使用,数据库的安装这里不做介绍,并且事先已经准备好相关数据. 本文中使用的student表中的数据如下: mysql> SELECT * FROM student; 一.SELECT语句的使用 1.单表查询 语法格式: SELECT culom1,culom2,culom3 FROM TABLE_NAME; 可以改变字段显示顺序 2.WHERE子句查询 语法格式: SE

MySQL基础知识

MySQL基础知识: 一. 知识点:        1. SQL分类:按照其功能不同,分为3中类别           DDL(Data Defintion Language):数据定义语句,用于定义不同的数据段.数据库.表.列.索引等.常用的语句关键字包括create.drop.alter等;             DML(Data Manipulation Language):数据操纵语句,用于添加.删除.更新和查询数据库记录,并检查数据的完整性.常用的语句关键字主要包括insert.de

MySQL(11):存储引擎

1.存储引擎是什么?       MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能. 例如,如果你在研究大量的临时数据,你也许需要使用内存MySQL存储引擎.内存存储引擎能够在内存中存储所有的表格数据.又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力). 这些不同的技术以及配套的相

Mysql数据库的触发器、存储引擎和存储过程

数据库的触发器 1.触发器 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句): DELETE,INSERT,UPDATE 我们可以监视某表的变化,当发生某种变化时,触发某个操作. 能监视:增,删,改 触发操作:增,删,改 2.触发器应用场景: 1.当向一张表中添加或删除记录时,需要在相关表中进行同步操作.比如,当一个订单产生时,订单所购的商品的库存量相应减少. 2.当表上某列数据的值与其他表中的数据有联系时.比如,当某客户进行欠款消费

MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)

先去查一下"引擎"概念. 引擎(Engine)是电子平台上开发程序或系统的核心组件.利用引擎,开发者可迅速建立.铺设程序所需的功能,或利用其辅助程序的运转.一般而言,引擎是一个程序或一套系统的支持部分.常见的程序引擎有游戏引擎,搜索引擎,杀毒引擎等. Ok,我们知道了,引擎就是一个程序的核心组件. 简单来说,存储引擎就是指表的类型以及表在计算机上的存储方式. 存储引擎的概念是MySQL的特点,Oracle中没有专门的存储引擎的概念,Oracle有OLTP和OLAP模式的区分.不同的存储