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

数据库介绍  html

什么是数据?前端

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

什么是数据库?算法

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

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

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

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

  2.支持事务管理缓存

  3.数据操做的并发安全

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

使用数据库的优点:

1.数据的独立性:

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

2.数据的冗余:

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

3.数据的安全:

  不一样的用户能够看到独立的数据

4.数据的利用率:

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

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

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

数据库的分类:

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

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

什么是关系型数据库

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

  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数据库介绍

安装方式不少,源码安装,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 二 2018-09-25 12:08:45 CST; 2 weeks 3 days ago
 Main PID: 4630 (mysqld_safe)
    Tasks: 23
   CGroup: /system.slice/mysqld.service
           ├─4630 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
           └─4757 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mys...

9月 25 12:08:23 localhost.localdomain systemd[1]: Starting MySQL Community Server...
9月 25 12:08:42 localhost.localdomain mysqld_safe[4630]: 180925 12:08:42 mysqld_safe Logging to '/v...'.
9月 25 12:08:42 localhost.localdomain mysqld_safe[4630]: 180925 12:08:42 mysqld_safe Starting mysql...ql
9月 25 12:08:45 localhost.localdomain systemd[1]: 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的逻辑架构主要分为三层,分别为服务层,核心层和存储引擎层,首先在这张图的最上边,能够看到有不少的客户端链接着连接线程处理。连接线程处理这一层就称之为服务层,它主要的目的是为客户端请求作连接处理、受权认证、还有安全等等。那么当咱们客户端的连接请求被服务层处理以后,而且容许连接,就进入到执行工做的这一环节,那么这些工做由核心层来进行完成。比方说下达一个查询指令,查询数据库当中的记录,那么首先会进入到核心层的查询缓存,先看看缓存当中有没有对这条查询语句的缓存信息,若是有,直接从缓存当中获得答案,这速度的最快的,若是没有,接下来能够去查找分析器。

  分析器用来分析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下达一个查询以后,具体的执行过程会是什么?一个查询过来每每对应的就是在SQL语句当中的一句select语句,那么MySQL会严格匹配这条select语句,若是在缓存当中发现了有如出一辙select语句的结果缓存的话,那么就能够经过缓存的方式直接返回给用户结果,这是查询最快的一种方式,若是没有缓存的话,那么它就会走左边的这个分支,首先它要解析查询,理解下达的这个select语句是什么意思,要查什么表,查什么字段,或者说要作多表查询的话,是那些表联合成什么样子?是否须要作排序?是否须要作分组?或者是其它的,接下来它会优化你的select语句,就是根据本身数据库当中的数据结构和存储来优化select语句执行的方式,让它以最好的效率来执行,优化好相应的语句以后,再去执行查询,而且把查询的结果返回给用户。一样查询结构也能够被缓存到缓存当中。以方便下次若是来了一样的查询,能够快速的获得结果。就不须要再走左边分支这么多的步骤了。

 

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

整个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:查看当前数据库使用的总大小

 

 

 

后续持续更新中。。。

相关文章
相关标签/搜索