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

数据库介绍 

什么是数据?

  数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材。数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等。数据和信息是不可分离的,数据是信息的表达,信息是数据的内涵。数据本身没有意义,数据只有对实体行为产生影响才成为信息。数据可以是连续的值,比如声音,图像成为模拟数据。也可以是离散的,如符号、文字、称为数字数据。在计算机系统中,数据以二进制信息单元0,1的形式表示。

什么是数据库?

  数据库(database):是按照数据结构来组织、存储和管理数据的仓库

什么是数据库管理系统(DBMS)?

数据库管理系统:是由数据库及其管理软件组成的系统

  1.提供数据持久性的存储,备份,恢复

  2.支持事务管理

  3.数据操作的并发

  4.支持独立的管理语言(SQL语句)

使用数据库的优势:

1.数据的独立性:

  元数据的存储,应用程序程序不需数据格式问题

2.数据的冗余:

  最小化数据冗余,保障数据的统一性和一致性

3.数据的安全:

  不同的用户可以看到独立的数据

4.数据的利用率:

  使用结构化的数据管理语言(SQL语句)

5.简单的数据备份和恢复:

  提供多种数据备份恢复方式,使数据的安全性更高

数据库的分类:

  1.关系型数据库(MySQL,Oracle,db2,sqlserver)

  2.非关系型数据库(MongoDB,HBASE,Cassandra)

什么是关系型数据库

  关系数据库,是简历在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。显示世界中的各种实体以及实体之间的各种联系均用关系模型来标识。关系模型是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”。先如今虽然对此模型有一些批评意见,但它还是数据库存储的传统标准。标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。

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

  mariadb数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用gpl授权许可。开发这个分支的原因之一是:甲骨文公司受够了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

  MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面。10.0.9版起使用XtraDB(名称代号为:Aria)来代替MySQL的innodb。

  mariadb直到5.5版本,均依照MySQL的版本,因此,使用mariadb5.5的人会从MySQL5.5中了解到mariadb的所有功能。

  从2012年11月12日起发布的10.0.0版开始,不再依照MySQL的版号。10.0.x版以5.5版为基础,加上移植自MySQL5.6版的功能和自行开发的新功能。

  MariaDb的api和协议兼容MySQL,另外又添加了一些功能,以支持本地的费阻塞操作和进度报告。这意味着,所有使用MySQL的连接器,程序库和应用程序也将可以在mariadb下工作。

MySQL数据库介绍

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

安装方式很多,源码安装,yum包安装,自行百度。

[root@localhost ~]# systemctl status mysqld
● mysqld.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since 二 -- :: CST; weeks days ago
Main PID: (mysqld_safe)
Tasks:
CGroup: /system.slice/mysqld.service
├─ /bin/sh /usr/bin/mysqld_safe --basedir=/usr
└─ /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mys... 9月 :: localhost.localdomain systemd[]: Starting MySQL Community Server...
9月 :: localhost.localdomain mysqld_safe[]: :: mysqld_safe Logging to '/v...'.
9月 :: localhost.localdomain mysqld_safe[]: :: mysqld_safe Starting mysql...ql
9月 :: localhost.localdomain systemd[]: Started MySQL Community Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]#

修改/etc/my.cnf,在[mysqld]小节下添加一行:skip-grant-tables=1,重启MySQL服务;

MySQL监听端口为:3306,MongoDB默认端口为27017

简单操作参考我的另一篇博客:点击进入

体系结构介绍

 MySQL的架构

  所谓MySQL的架构指的是MySQL的逻辑架构,了解MySQL的逻辑架构可以帮助我们更好的理解MySQL是如何工作的,以及在MySQL工作过程当中我们需要注意的一些地方,并且理解一些有关于数据库的基本概念和知识。

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

首先正如上图,MySQL的逻辑架构主要分为三层,分别为服务层,核心层和存储引擎层,首先在这张图的最上边,可以看到有很多的客户端连接着链接线程处理。链接线程处理这一层就称之为服务层,它主要的目的是为客户端请求做链接处理、授权认证、还有安全等等。那么当我们客户端的链接请求被服务层处理之后,并且允许链接,就进入到执行工作的这一环节,那么这些工作由核心层来进行完成。比方说下达一个查询指令,查询数据库当中的记录,那么首先会进入到核心层的查询缓存,先看看缓存当中有没有对这条查询语句的缓存信息,如果有,直接从缓存当中得到答案,这速度的最快的,如果没有,接下来可以去查找分析器。

  分析器用来分析SQL语句,了解我们到底要查找什么,并且还会到优化器中优化我们的SQL语句,最终再重新执行查询。所以说核心层它的主要工作是查询解析、分析我们的SQL语句、优化SQL语句、缓存查询的结果,以及所有的内建函数的存储过程、触发器还有视图等等,都是在核心层来完成的。最后是存储引擎层。当我们要查什么东西这件事情被数据库理解之后,那么查这些数据呢就会涉及到数据库的操作。存储引擎这一层就是来完成这项工作的,它完成存储和提取数据以及事务处理。

  接下来看一些具体的组成部分,首先来说客户端,客户端对于MySQL来讲,它并不是具体指某一个客户端软件。有些人可能就会认为MySQL这个命令他就是MySQL的客户端,其实这个并不是精确的说法,实际上MySQL客户端它是一种非常复合的一种概念,包含不同程序语言编写的前端应用程序和所调用的api接口。或者可以通俗的来讲,只要能够连接数据库并且可以对MySQL进行操作的软件,都可以称之为MySQL的客户端。形象来讲,比方说假设一个网站使用lnmp的环境,其中中间件使用的是PHP,而PHP通过调用PDO这个组件,可以连接MySQL的数据库。这个时候就可以说PHP这个中间件它就是一种MySQL客户端。

  客户端:

  1.MySQL客户端并不具体指某个客户端软件、

  2.实际上MySQL客户端是一种符合的概念。包含

    (1.不同程序语言编写的前端应用程序;2.所调用的api接口)

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

  服务层在这里主要完成线程的管理,是服务是为链接线程进行处理,为客户端请求做链接处理、授权认证等等。这一系列都在操作系统这个层面上由线程来进行完成。MySQL是一种单进程,多线程的软件。在这里假如说有一个链接,链接过来之后,正如这个图所看到的,进程中可以创建出新的线程,或者说派生出一个新的线程,为这个连接来提供服务。但是并不是所有的链接都可以得到新创建出的线程,因为创建线程和消除线程本身也是一种消耗系统资源的行为,所以MySQL会非常聪明的创建出一种叫做线程缓冲池的东西,把已经被使用过的线程,现在不用了,先缓存在缓冲池里面,接下来有新的链接过来,那么MySQL会有限的使用线程缓冲池中的线程为用户提供服务,这样就大大节省了相应的系统资源,让MySQL能够承受更大并发量的访问,这也是MySQL非常优秀的一点。

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

  在上图当中,对MySQL下达一个查询之后,具体的执行过程会是什么?一个查询过来往往对应的就是在SQL语句当中的一句select语句,那么MySQL会严格匹配这条select语句,如果在缓存当中发现了有一模一样select语句的结果缓存的话,那么就可以通过缓存的方式直接返回给用户结果,这是查询最快的一种方式,如果没有缓存的话,那么它就会走左边的这个分支,首先它要解析查询,理解下达的这个select语句是什么意思,要查什么表,查什么字段,或者说要做多表查询的话,是那些表联合成什么样子?是否需要做排序?是否需要做分组?或者是其它的,接下来它会优化你的select语句,就是根据自己数据库当中的数据结构和存储来优化select语句执行的方式,让它以最好的效率来执行,优化好相应的语句之后,再去执行查询,并且把查询的结果返回给用户。同样查询结构也可以被缓存到缓存当中。以方便下次如果来了同样的查询,可以快速的得到结果。就不需要再走左边分支这么多的步骤了。

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

  存储引擎层比较值得我们关注的是这个可插式存储引擎,这个是MySQL非常好的一个特点,因为不同的存储引擎它的特性、功能、和使用范围是不一样的。MySQL可以根据相应不同数据的特性来选择合适的存储引擎,使用者也可以非常方便的去挑选不同存储引擎来完成自己的工作,存储引擎就是查询管理操作数据的东西,数据都要存储在当前的存储设备当中,在存储设备当中具体体现为一个个的文件,那么这些数据相应的包含了MySQL数据库的数据文件,还包含了很多相应的日志,这些都是由MySQL所产生的,因此可插式存储引擎可以支持多种的文件系统,包含在Linux中常用的ext系列文件系统,NTFS等等,这些都是可以通过存储引擎来进行使用,另外存储引擎还可以处理文件和日志,比如说索引文件、二进制文件、慢查询日志等等,这些都是由存储引擎最终写入到存储当中的。

整个MySQL逻辑架构的总图

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

  我们可以把它们集合在一起再来看一下,首先最上面这个叫做支持接口,支持的接口包含标准C的API,JDBC,ODBC等等应用程序的API接口,这些接口会被相应的客户端应用程序所调用,用来连接到MySQL数据库。那么MySQL server当中第一个处理这些链接的就是连接池,刚才提到过了,连接池用来缓存相应的线程,每一个连接都提供线程为其进行服务,那么在这个服务过程当中完成了验证授权、链接限制、内存缓存管理等等一系列的功能,再接下来右边有一个竖列表示企业管理服务和工具,比如说备份恢复、安全、复制、集群、分区管理、事例管理等等,这些都是相应MySQL内检的功能或者工具,甚至有一些是单独的命令,它们参与了这方面的管理,再往下可以看到四个重要的组成部分,分别是SQL接口、解析器、优化、缓存和缓冲池,首先来着看这个SQL接口,这个是数据管理语言和数据定义语言、存储过程、视图、触发器等等,这些SQL接口支付了相应SQL语句的实现,也就是下达的SQL语句指令,就是由这里来进行功能上的支持,在功能支持的基础之上要用到第二个组成部分,就是这个解析器,解析器对查询以及相应带的事务对象进行优先级的划分,并且SQL语句进行优化,解释理解这些SQL语句,最终放到优化的这个组成部分当中,解释清楚了之后才能进行优化,所以说这个优化就是对访问路径、统计等等进行优化操作。然后在旁边可以看到缓存和缓冲池,它用来缓存对MySQL进行操作的结果,包括查询缓冲以及其他各种类型的缓冲,用来加快数据执行的效率。

  再往下面就是MySQL的特点,很好地一个特性就是可插式存储引擎,在这里它可以支持多种不同的存储引擎,可以把它形象的理解成为:当要操作某一个数据的时候,上面这一层就会调用其中一个存储引擎,好想一个插销一样,查到下面存储这一层上来了,而存储这一层就是相应的文件系统、文件日志等等这些系统层面的东西。那么这一层就是把MySQL与当前系统当中的文件这一层连接在一起的这么一个环节,它也是非常重要的。以上就是MySQL相应的逻辑架构,链接这个逻辑架构之后。通过这个逻辑架构可以更好的去理解MySQL对一些行为的处理方式,比如说事务处理。

结构化查询语言SQL

  结构化查询语言(缩写SQL),是一种特殊母的之编程语言,用于数据库中的标准数据查询语言,IBM公司最早使用在其开发的数据库系统中国, 1986年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言,1987年得到国际标准组织的支持下成为国际标准。不过各种同行的数据库系统在其实践过程中都对SQL规范作了某些改编和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。

  SQL是高级的非过程化编程语言,它允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解其具体的数据存放方式。而它的界面,能使具有底层结构完全不同的数据库系统和不同数据库之间,使用相同的SQL作为数据的输入与管理。它以记录项目【records】的合集(set)项集【record set】作为操纵对象,所有SQL语句接受项集作为输入,回提交的项集作为输出,这种项集特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它拥有极大的灵活性和强大的功能。在多数情况下,在其他编程语言中需要用一大段程序才可实践的UI个单独实践,而其在SQL上只需要一个语句就可以被表达出来。这也意味着用SQL可以写出非常复杂的语句。

SQL分类 

  • 数据查询语言(DQL)
  • 数据定义语言(DDL)
  • 数据操纵语言(DML)
  • 数据控制语言(DCL)

数据库基本操作

1.数据查询语言(DQL)

数据查询语言(DQL)是SQL语言中,复制进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。

语法结构:

SELECT [要提取的字段名,或使用“*”代表全部的字段]
FROM [要提取的资料的来源,包含表或视图名等] -- 可搭配JOIN做关联式连接
WHERE [提取的过滤条件] -- WHERE 可有可无
GROUP BY [要分组的字段] -- GROUP BY 对数据进行分组时使用
HAVING BY [要做分组的字段] -- 要使用聚合函数作为条件时使用
ORDER BY [要排序的字段与方向] -- ORDER BY 可有可无,若没有则是按照查询引擎的输出排序为主

2.数据定义语言(DDL) 

数据定义语言(DDL)是SQL语言中,负责数据结构定于与数据库对象定义的语言,由CREATE、ALTER与DROP三个语法组成,最早是由Codasyi数据库模型开始,现在被纳入SQL指令中国作为其中一个子集。

语法结构:

CREATE 可以用来创建用户、数据库、数据表、视图、存储过程、存储函数、触发器,索引等。
ALTER 是负责数据库对象修改的指令
DROP 是删除数据库对象的指令,只需要指定要删除的数据库对象名即可

3.数据操纵语言(DML)

数据操纵语言(DML)是SQL语言中,负责对数据库对象进行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入,更新与删除。

语法结构:

INSERT 是将数据插入到数据库对象中的指令,可以插入数据的数据库对象有数据表以及可更新查看表两种。
UPDATE 指令是依给定条件,将匹配条件的数据表中的数据更新作为新的数值。
DELETE 是为数据库对象中删除数据的指令

4.数据控制语言(DCL)

数据控制语言(DCL)在SQL语言中,是一种可以对数据访问权进行控制的指令,它可以控制特定用户账户数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。由GRANT 和 REVOKE 两个指令组成。

DCL以控制用户的访问权限为主,GRANT 为授权语句,对应REVOKE是撤销授权语句。

具体操作看之前的几篇博客。。。

什么是数据类型?

数据有着不同的分类,比方说,数字这是一种类型的数据,字符是一种类型的数据,日期是一种类型的数据,那么这种不同类型的数据,数据库处理的方式,比如说如何进行存储,如何进行查找,如何限定它的长度,甚至存储的一些方式还有算法都不尽相同,所以对于数据库来讲需要定义不同的数据类型,然后根据数据类型再去做相应的操作,这就是数据类型。

定义数据类型本质上是再定义列

所谓的定义数据类型,其实就是指在创建表格的时候,告诉数据库这张表有哪些个列,或者称之为叫有哪些字段,那么每一列存储的数据是什么类型的,所以我们可以这样说,定义数据类型的本质,其实就是在定义列。

数据分类的意义

分配合适的存储空间:

  不同数据类型所占用的存储空间时不一样的,甚至同一种类型的数据的多种不同子分类,它所占的空间也是不同的,这个技术实现是有相应的关系的,所以数据需要分类。

采用不同的操作方法:

  比方说如果把一个日期2014年1月1日以数字的形式存放到数据库当中,那么就是20140101,对于数据库来讲它只是一串数字,而如果以日期的方式存放到数据库当中,那么数据库就会知道2014是年,01是月,最后一个01是天,就具体有着不同的含义了,那么就决定了最终的操作方法,比如说像查找2013年12月31日晚上的时间的时候,这个时候日期类型就可以匹配出来,而数据类型就做不到这一点。

对应不同的需求:

  如果存放的仅仅是一个姓名的情况下,那么这种数据往往最多也就是3,4个字,还没见过咱们国人的名字有七八十个字的。但是如果存放的是个人简介,相应的这个数据类型只能存10,11个字的话就不合适了,可能是一两百个字。这时候就需要另外一种数据类型,所以说数据分类也是对应不同的需求。

整数类型:

MySQL中提供多种对于数值的数据类型

不同的数据类型取值范围不同

取值范围越大,需要的存储空间也越大。

存储带小数的类型:

浮点数和定点数类型用来存储带小数的数值

使用(M,D)的方式设定M精度(或显示总位数)和D标度(小数的位数)

定点数就是规定相应的数值所存储数据的长度和精度,所以它消耗的存储数值的长度是不固定的,由规定的范围来决定,它的算法就是,当M>D的时候M+2,M<D的时候D+2。(3,2)消耗五个字符,它的方位取决于我们给它定义的M和D。

超出精度范围会采用四舍五入

超出值范围会报错

double和float区别不大,只是范围更广,有意思的是定点数。

M最大值65,D最大30,最多的整数位35,和30位小数。默认D为0 M为10

日期和时间的类型

MySQL中提供多种用于存储日期和时间的类型

根据需求,并注意格式。

用单引号,mysql就会将0作为年份最右边的数字,如果是4位的年,就会转换为2000年,因为四位的年份是从1901到2155,MySQL会尽可能匹配更多的零,4个0是非法的,因为没有4个零的年,两位数也是一样的。

TIME:

-838:59:59 到838:59:59 time不是表示我们通常意义上的24小时,二十表示已经过去了的时间,或者是过去了多少时间,花费了多少时间,所以计数的角度可以超过24小时

DATE

历史年份,公元,date无法解决

DATETIME时间是24小时的。8个字符,TIME + DATE 6个字符。节省两个字节

TIMESTAMP根据当地时间计算,会受到系统时区的影响。

生产环境中只要所有的服务器与时间服务器进行同步就不会有问题。TIMESTAMP只占用4个字节。是所有日期和时间类型中最节省的。

字符串类型:

1.字符串类型是一个统称,包含多种不同数据类型

2.分为文本字符串类型和二进制字符串类型。

3.不仅可以存储字符串,还可以存储其它数据。

4.字符串可以区分或不区分大小写的串比较

5.支持进行模式匹配查找。

CHAR(M)长度是固定的,M规定字符串的长度

VARCHAR(M)

concat() 合并字符串的函数


MySQL5.5之后,开启STRICT_TRANS_TABLES。考虑到在某些严格的情况下,错误字符串的截断可能导致数据不完整,或数据的意义发送损坏,所以与其插入错误的损坏的数据,不如不让插入。设计数据库的时候记得查看默认的SQL mode是什么。

ENUM类型,又称为枚举型

ENUM类型存储的数据好比是单项选择题的选项。其存储的值为表创建时在列规定中枚举的一列值,给出几个选项,执行插入规定的值。

SET类型

与ENUM很相似

ENUM类型存储的数据好比是多项选择题里面的选项。其存储的值为表创建时规定的一列值。

选择合适的数据类型 

刚才上面所写的只是MySQL中一部分数据类型,更多的数据类型可以查看MySQL的官方手册。有那么多的数据类型,在什么情况下应该使用什么数据类型呢?

字符串类型的选择

1.不同的数据引擎,选择倾向不同。

  1)MYISAM的选择

  2)innodb的选择

  3)MEMORY的选择

2.不同的用途,选择倾向不同

  1)CHAR:很短的字符,经常变更的内容

  2)VARCHAR:与上条相反

存储引擎 

MYISAM

MYISAM,是一种非常适合读多写少的数据引擎,让myisam读取char定长字符类型的时候,效率比varchar好得多。因为varchar是可变的,所有在查varchar数值的时候还要去查找数据结尾的位置,char是定长的可以节省查找的步骤,所以char效率会高于varchar。

InnoDB数据引擎 

innodb数据引擎技术实现上是与MYISAM不一样的。char和varchar区别不大,这时varchar可变长度的优势就展现出来了。varchar是可变长度,因此更节省空间。例如char(10)无论存储多少都是10长度,varchar(10)可以根据实际长度存储。因此varchar更节省存储。

Memory数据引擎 

将数据存储在内存中,因为内存空间更为宝贵,那么varchar更合适使用。读取char和varchar的效率可以忽略,因为存储的速度要远远高于磁盘的速度。

- 不同的用途,选择倾向不同。

  CHAR:很短的字符,经常变更的内容

  VARCHAR:与上条相反

如果存放3,5个字符定长和变长的差别不大,差不了几个字符,可以选择char。

浮点数和定点数的选择

1.精度要求不同,选择大不同

2.相比较而言,定点数的计算代价要昂贵的多。

单精度float和双精度double精度范围是不一样的,根据存放浮点的范围选择。定点数,用于汇率,工资,收益比值。

大数据类型的选择 

 1.能不用尽量不用

2.TEXT和BLOB有很多替代选择

3.如果存在经常的删除和更新,建议定期使用potimize table进行碎片整理。

存放的数据非常非常长。TEXT和BLOB能不用尽量不用。如果真的很长很长,可以静态化成一个个文本文件,然后通过数据库记录下这个文件的位置,去使用操作系统读取相应的文件来得到数据,效率更高。存数据库效率低很多。

电影可以存到MySQL中,二进制存放,但是效率很低。要从数据库中取出来,然后在内存中组成一个文件,在提交给相应的应用程序处理,不如以视频文件的形式存放在系统中,通过应用程序直接读取。

论坛,改贴,删帖。就会产生数据空洞。使用optimize table进行碎片清理。

日期类型的选择 

TIMESTAMP占用空间最少。但是注意它的特性

和时区有关,注意所有服务器的时区要一致。这个特性是全球化应用的好处。

希望存放的内容以当地时间的方式展示,唯一的选择就是TIMESTAMP

存储引擎 

  MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

MYISAM

  1. MySQL5.5.5之前的默认存储引擎
  2. 支持大文件,通常默认是256TB。(相应操作系统实现的限制)
  3. 适合读多写少的应用场景
  4. 每个MYISAM表的最大索引数是64,可以通过编译改变
  5. BLOB和TEXT类型可以被索引
  6. 支持全文索引(只有MYISAM支持全文索引)
  7. 仅支持表锁(无论是读锁还是写锁)
  8. 非事务性引擎
  9. .frm文件存储表定义,.MYD数据文件,.MYI索引文件

InnoDB:

  1. 目前MySQL的默认存储引擎
  2. 事务性引擎
  3. 支持行锁和外键
  4. 为巨大数据量的最大性能设计
  5. .ibdata1自动扩展数据文件。ib_logfile0/1日志文件

t_1这个表就是使用InnoDB存储引擎创建的,t_1.ibd就是这个存储引擎存放数据的文件。而且这个文件是自增长的,就是随着数据库增大,这个文件也就不断的增大,当然也可以通过其它手段对它进行修改。

MEMORY

  1. 将数据存储到内存中的存储引擎
  2. 不支持BLOB和TEXT列
  3. 非事务性引擎

另外一个需要注意的一点事,内存是一个断电不受保护的存储,所以如果一下停电了。这个数据就会丢失。一般MEMORY用来存放一些不需要持续性的存储,需要读写非常频繁的数据。比如说session的值,操作id,操作编号这些数据放到MEMORY存储引擎中。

最后还有NDB存储引擎,NDB是用于MySQL Cluster的集群存储引擎,它能够提供数据层面上的高可用性,这个事MySQL Cluster当中必须会使用到的一种存储引擎,当然NDB引擎对于多表查询等复杂性查询性能相对来说并不是很优势。比如说它对复杂性查询速度相比较MYISAM和InnoDB来讲都差不多,尚在不断完善中。。。

NDB

  1. 用于MySQL Cluster的集群存储引擎
  2. 提供数据层面上的高可用性
  3. 例如多表查询等复杂性查询性能相对不是很有优势
  4. 尚在不断完善中。。

MySQL事务处理

什么是事务?

  • 事务是有一组SQL语句组成的逻辑处理单元
  • 原子性
  • 事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
  • 一致性
    • 在事务开始和完成时,数据都必须保持一致的状态
  • 隔离性
    •   数据库系统提供一定的隔离机制,独立执行
  • 持久性
    •   事务完成之后,它对于数据的修改是永久性的,及时出现系统故障也能够保持。这一点是非常重要的

MySQL的并发控制 

  下面来看看MySQL的并发控制,这个MySQL的并发控制可以解释为什么事务是需要隔离的,为什么数据要是一致的,最后数据一定要是完整的原因。

多事务执行方式

好多好多的请求到来,好多好多的工作要做,怎么办?

  • 串行执行
  • 交叉并发执行
  • 同时并发执行

并发控制

  • 对并发操作进行正确调度
  • 保证事务的隔离性
  • 保证数据的一致性

相应多事务并发到来的时候对事务的处理方式

  • 同一时间只有一个事务运行
  • 效率低,无法充分利用资源

交叉并发执行

  • 多事务交叉运行
  • 单处理器的并发方式

同时并发执行

  • 多处理器系统中使用
  • 每个处理器处理一个事务

并发执行导致的问题

  • 并发势必面临“同读同写”问题
  • “同读同写”导致破坏事务隔离性和数据不一致

基本锁类型

  • 读锁
    • 又称共享锁
    • 当事务1对某个数据对象加读锁,则其它事务只能对此数据对象加读锁,不能加写锁。直到事务1释放锁
  • 写锁
    • 又称排它锁
    • 当事务1对某个数据对象加写锁,则其它事务都不能对此数据对象加任何锁

锁也是分类的,最基本的类型分为两种:一种是读锁,一种是写锁。顾名思义,读锁,就是对某个数据对象进行读的时候加个锁,读锁又称为共享锁,其它事务只能对此数据对象加读锁,补不能加写锁。直到事务1释放锁。第二个是写锁,写锁又称之为排它锁,当事务1对某个数据对象加写锁,则其它事务都不能对此数据对象加任何锁。又称之为独占锁。那么就这两种锁就是用来解决前面举得这几种发生数据不一致性的例子。      


事务transaction指定一组SQL语句

回退rollback撤销指定的SQL语句(只能回退insert delete update语句)

提交commit 提交未存储的SQL语句

保留点savepoint事务处理中设置的临时占位符,你可以对它发布回退(与整个事务回退不同)

示例。。略

事务的最后结果,要么是commit,要么是rollback

如果发生错误,或者数据库重启了,系统重启了,就做rollback

如何查看数据库的已经使用的大小呢?

在Linux中可以用:du命令

du -sh:查看当前数据库使用的总大小

后续持续更新中。。。

上一篇:刷seed有感


下一篇:MySQL学习【第九篇存储引擎】