欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 23_02 _数据库及MySQL 有大用

程序是由指令+数据组成


写bash脚本的时候,数据是保存在变量中的,

如果打开的是文件的话,文件就保存在进程的地址空间当中作为数据流来进行访问,


 当用户登录的时候,程序要找到这个用户 (怎么找 到哪儿找 用户存在什么地方)

(程序处理文件,处理数据的时候,如果数据太多,我们不足以保存在内存中或者用起来不方便的话,我们可以把它们保存在一个临时文件当中,然后对这个临时文件读进来,然后进行处理就可以了) (操作系统的用户登录的时候,靠的是 /etc/passwd  /etc/shadow 来检索用户信息的, /etc/passwd 很小,几十个用户,数百个用户就己经变得很大了)


论坛 bbs ,假设有100w个用户 10000w个贴子

image.png

假设 grep root   从 100w条记录中找 ,太吃力

1)我们把 /etc/passwd 切割成段,我们只拿其中一个字段进行比较就OK了,

2)虽然我们只比较一个字段,但是范围仍然是很大的, 我们从上到下,逐个比较也是很麻烦的

    排序 二分法 来查找

    平均14次左右就能找到对应的结果了

(前提是文件得先排好序)

/etc/passwd 不可能是按用户名的顺序创建的,我们怎么办?

很简单啊,我们比较的都是用户名本身,

将用户名的所有用户名信息提出来,再建一个文件(数据库), 文件里面只有用户名,

而且文件是自动建立的,并且是有序的,所以我们找的时候,只需要针对这个有序的文件找就可以了,


image.png

但是我们找到用户的时候,这个文件里面只包含用户名,这个文件里面必须有一个指针,指向那个实际的数据所在的位置,

image.png

image.png

image.png

我们查找帮助我们去查找一种数据结构,我们称之为索引


二分法是一种查找数据的方法,太慢了,我们还要查找14次,


B+树索引: 它结合使用稠密索引和稀疏索引来完成对文件的索引,

使得一般情况下,我们平均找到任何一个数据,只需要4次就OK,但是它总得依赖于别的数据结构

image.png



可能一个索引还不够,因为你的查找标准各不相同(有时按id,有时按用户名),

查找标准我们称之为搜索码 (搜索关键字段)

因此索引应该跟搜索码相匹配的,谁来帮我们管理索引呢?万一我们又新增了一个用户

假设这个用户的排序不是在最后,而是在中间,索引是不是要更新呢?

如果在数据文件中删除了30个用户,30个用户在索引中也有数据,数据也要删除,那这个需要的工作比较复杂

我们通过文本文件,这两个文件(索引文件 数据文件) 没有任何关联性,我们需要开发一个应用程序来维持它俩之间的关联性,

不然的话,手动维护这两个文件,在数据文件里面增加一个用户,索引文件里面就得更新一个条目 ,  在数据文件中删除了30个用户,索引文件里面也得更新30个条目, 这是非常麻烦的,于是我们需要开发 一个程序,这个程序能够很简单的告诉我们说,你只要指定一个标准,我自动的根据你所指定的那个字段,给你创建一个索引,而且当新增一个用户的时候,这个程序自身会关联性的把 数据文件插入一个用户,那么索引文件也添加一个条目 ,数据文件删除一个用户,那么索引文件也删除一个条目                  这个程序可以称为数据管理软件,它能够帮我们维护这里面索引关联性,有了索引关联性的维护软件以后,当我们的php应用程序想去查找一个用户的话, 通过 php:查找算法 (比如 B 树算法),可以根据我们的索引结构来实现快速查找文件,所以查找过程由php来完成(查找过程由php自身来完成) 也就意味着 我们的应用程序无论什么时候想查找一个用户,根据某个标准查找某个数据,都得自己开发一段程序 (每次都要开发查找数据的程序)  我们可以把这个工作简化 1)把查找算法做成一个公共模块,谁用的时候谁拿来用,就可以了,(这种算法本身还要跟php结合起来)  2), 把查找算法做在一个软件里面,让这个软件来完成查找,我们只需告知这个软件,我们根据什么来查找,查找标准是什么,就是我们的搜索码是什么,搜索过程由这个软件来完成


image.png

image.png


image.png

在这里 我们要做的是 有两种查询: 

1) 在 php 中查询

2) 在数据管理软件中查询   这样子的话,php程序只告诉查找数据库标准并取得数据

        这样子的话数据管理软件就具备数据查找能力,查找算法的应用程序的实施实现过程


比如php 往数据库中插入一个用户,要检查用户是否有同名的(所以任何时候对数据插入更新删除的时候,得先查询,看有没有它,)

我们把这个功能 又放到数据管理软件里面去了


我们的php怎么跟数据库通信 (apache与 php通信 ,要么模块,要么cgi,要么fastcgi ,必须要用一种协议)

php与数据库要用双方的协定:协议

双方必须要事先遵循一种标准(一种协议,一种规范)

实现这个协议,靠的是程序来实现的

数据管理软件本身所提供的查找新建更新删除等能力(它们都是一个个的命令)通过哪一种接口输出出来,我(可以理解为php)怎么调用,能不能理解数据管理软件的命令, 这些命令怎么能够发过来,数据库软件怎么能够接受什么样的语法格式,数据库软件为什么能够理解php程序发来的命令,这些命令怎么能够交互呢


数据库软件要把查找新建更新删除等的命令共享出来,怎么共享?最简单的方式是通过API(应用编程接口)

假如说我们这里提供了一个API(一个应用编程接口),其它人开发的php程序直接调用这个接口的功能就OK了

这个API就是库,这个库可以提供查找新建更新删除等功能

image.png

这个API本身是用什么语言写的

假如是 C 语言开发的API  (php程序好像不能调用C语言的API,所以还要提供PHP的API,意味着API有多种语言)

image.png

用户要想使用数据库里面的数据,就必须基于某个接口(比如php的API)来开发程序,而后取得数据之后,再把数据返回给过来给用户

image.png

不是一个程序员,从数据库里面找数据,不能找到数据,因为(比如我们存数据,就必须调用API的功能才能完成) ,所以我们必须首先得是一个程序员,这是没有选择的

增删改查都是API,API都是函数,( function ) (比如查询,返回过来的数据,如何显示(怎么格式化,转成HTML文档,由web服务器来显示),都是应用程序php自身的问题了,跟底层的数据库软件是没有关系的)

image.png

C程序员,学习C的API,PHP程序员,学习PHP的API,

两种API的格式肯定不一样,甚至名称也可能不一样

这么多API用起来太困难了(因为风格不统一)

要背一堆函数,(每次开发程序都要先放一个库字典,用到某个库,查字典,甚至有时不知道有哪些库,哪些库有哪些功能都不知道,所以要事先背会)

所以在上面再封装一次,将它们的(多种不同的API)风格统一起来 (比如说统一成 ODBC ( open database connection 开放数据库系统互联))     它把各种API都通过一种统一的风格输出来了,几乎任何一种语言都使用这种统一的风格来调用 (这样子,使用C语言来调用ODBC,使用C++ JAVA PHP 都可以调用ODBC,ODBC要统一到各种语言上,每一种语言都能用 ,,ODBC做的接近于PHP,JAVA就不能用了,ODBC做的接近于C,PHP用起来很困难,)(所以我们做的不能过分接近于语言,那就意味着ODBC仍然非常底层)(ODBC虽然比各种API要高端一点,但是ODBC仍然非常的底层,意味着程序员调用的时候还是要写很麻烦的指令)



image.png

(对于php程序员来讲,C程序员来讲,无论使用API还是ODBC,都要自己去写函数什么的,都要自己去调用函数)

(如果有一个模块(驱动)放这儿,我们也不用调用了,直接给我们非常非常简单的接口,我们只需要告诉这个接口干什么,这个接口就自动去干了,,)

所以,我们从不统一,走到了统一,从统一又走到了不统一(这种不统一,非常简单的调用接口(只要告诉这个接口或驱动,搜索码是什么,查出来吧,就完了),最终非常接近于语言(比如php语言,但是离数据库管理软件越来越远了))这种接近语言的接口叫驱动(可以理解成驱动)这种驱动其实就是一种翻译软件,上层的程序(比如php)非常容易理解驱动,但是底层的数据库软件不理解,,,驱动就负责把它翻译成对应的API (其实ODBC就用不着了)


这个驱动(比如 php驱动 java驱动 C驱动 C++驱动)负责翻译成C的API,因为大家知道,我们的程序可能是C开发的,而C或C++的性能是最好的,所以这个驱动( 比如 php驱动 java驱动 C驱动 C++驱动 )负责翻译成对应的C的API

所以php程序员只需要使用php驱动就OK了

所以java程序员只需要使用java驱动就OK了

这个驱动跟这个语言结合非常紧密,而且跟这个语言内部很多库的使用风格是非常非常近似的,所以用起来非常简单


那很显然,我们开发的php程序用到了这个驱动的功能,而我们没有提供php的这个驱动,它就不能跟我们的数据库交互了

(假如我们开发的php程序,非常牛,它直接调用php的API来开发操作数据库的,那么这个驱动有没有都无所谓)

(大家理解编程,以及理解两个系统怎么交互了吧,所以它们中间可能有很多中间层,这个中间层用或者不用,取决于我们的编程程序员 )(这个中间层越接近于上层的用户程序(比如php),我们的用户(php程序员)用起来就越方便)



image.png


image.png

但是这意味着作为中间层的管理员来讲,我们所需要提供的运行环境就是越来越复杂

假设php程序直接使用API来编程,我们只要提供这个API就OK了

如果用到驱动,我们必须要部署好驱动,php才能调用的

驱动和程序语言本身是分离的

驱动由数据库管理软来提供或由php解释器来提供都可以,谁提供的好,就用谁的

作为运维人员来讲,作为系统管理员来讲,你得让它存在,只要别人要用,你就要部署好

有了这个驱动,我们就可以简单的完成数据访问了(完成数据管理了)

这个驱动是个编程接口,只不过比下面的API接口更高级更简单,简化了许许多多而已

不是一个程序员还想从中查数据怎么办

image.png


image.png

shell是这个预留的接口,让我们与内核进行交互,shell其实就是一个接口,只不过shell要调用库功能的

shell能够直接使用系统调用来开发 (系统调用就相当于 上面讲的API,太底层了)

 将系统调用封装成更高级的模块,就是相当于刚才我们所说的驱动

这些模块,封装了API,而且使得用户应用程序员开发的时候,可以直接调用这些模块就可以了,这样开发周期就缩短了

image.png

要做馒头,,,,,,,有种子,刨地,种麦,收获了后,磨成面粉才能做馒头,

别人已经有好的面粉了,直接就可以做馒头了

系统提供给我们的当作种子, 这些模块(库)提供给我们的就是面粉

越接近最终目标,对我们而言就越简单

当然了中间的层次,越要接近最终目标,中间层就越复杂

不会做馒头,又想要吃馒头,怎么办?(人家提供的只有面粉)

shell就是人家做好的馒头

当然shell下还有别人做好的各种各样的馒头,这是我们的应用程序

别人通过shell来直接调用馒头就可以了

shell 不能凭空打开,只能附着在某个终端上 (物理终端,虚拟终端,伪终端)

image.png



是程序员通过驱动来更简单

不是程序员给它提供一个访问界面,在上层给它提供一个命令行接口

用户通过命令行接口接进来以后(这个命令行接口提供了一些内置的命令,或者外置的命令,这些命令本身可以调用API的功能完成相应的工作的)

image.png


通过接口使用命令行(馒头)跟API(进而跟数据库系统)进行交互

image.png

数据库软件系统是一个应用程序,只需要我们有个客户端或专用程序就可以打开了

有个专门的打开界面,这通常是一个客户端

这个客户端能够借助于shell,打开能够建立TCP/IP的通信,

任何时候,我们在客户端上,就能够打开类似于shell的交互式界面,在客户端里面输命令

命令通过协议送给数据库软件系统的服务器端,服务器端接收命令并作命令分析以后,

去运行这个命令,所以服务器端是命令的解析器(解释运)


客户端ssh 服务器端sshd 然后呢 服务器端借助于bash来负责解释命令

image.png


客户端连到服务器端上,服务器本身能够将解释器所提供的功能输出给客户端命令行界面

(对于shell来说,不是ssh帮我们执行命令的,ssh只是负责把命令安全的送到服务器端的)

数据库软件系统也是同样的道理

image.png

像web服务器,监听在某个端口上,多个用户同时访问(prefork模型)

一个进程响应一个用户请求,

所以我们的数据库软件系统如果是多个客户端连进来是要启动多个进程的

如果进程太多,软件就过于复杂了

所以事实上数据库软件系统是基于线程来工作的

每个用户连进来,它是生成一个线程来响应的,它总得有个上限吧(只能20个,如果有80个进行的话,其它60个就进行排队)

怎么来限定 20 个呢? 我们一般采用线程池来进行定义

thread pool ,池子里面只能放20个,一下子最多只能装进20个,

线程池是一种尤其是大量用户并发涌进来的时候,如何控制它的流量的



这个软件组合起来,这个软件就叫数据库管理系统

它不是一个数据,它只是一个数据库管理系统,

它能够帮我们增加数据,创建索引,建立索引与数据之间关联关系

插入数据,相应的更新索引,它的功能其实有很多(比如 用户不能随便访问里面的数据,所以还要实现权限管理,需要用户提供账号密码;;;不同的用户能够访问的文件可能不一样,

每个用户能够访问哪些数据,甚至能够访问多少行数据,我们都能够进行定义

这就是我们的用户和权限模型)

image.png


专门负责数据管理的工具,就叫做 DBMS

DataBase Management System  数据库管理系统



比如 /etc/passwd 展示给用户的是文本文件,展示在磁盘上的是数据流(二进制文件)

对于我们系统管理员工程师来讲,让文件保存在磁盘上是一种格式,展示给用户的是另外一种格式

我们系统管理员其实是可以看到两种格式的

文件展示出来的形式有许许多多种,但是在底层都是以0,1代码保存的

我们怎么展示更接近用户,

image.png



数据的组织结构(逻辑结构)有很多种

数据的组织结构

    层次型  有上下级关系的

    网状结构

    关系型结构


耦合度紧密

下面的图是层次型结构

image.png

下面的图是网状结构

image.png

下面的图是关系结构

        表 由于行组成,记录每个用户的信息,每个贴子的信息,每个回复的信息

               每个表中有很多字段,这些字段表明了对象的某一种属性

 每一个对象叫条目

条目之间的关联关系 就叫关系

image.png

image.png


能够负责将数据组织成以表的方式来展示,并且能够帮我们维护表和表之间的关系的这么一种软件,

就是 关系型数据库管理系统 (RDBMS  Relational Datatbase Mangement System)

image.png


对于磁盘来讲,数据是存储在磁盘上的,磁盘上的文件管理是靠文件系统来管理的,

文件系统管理文件的时候表现为一个一个的文件

我们看到的一个表,在底层未必是一个文件,可能是多个

多个表,在底层可能是一个文件

作为管理员来讲,看到的最终的底层文件可能是多个的


用户视图

底层物理视图

DBA视图既能看到 上层的用户视图,又能看到底层物理视图

image.png

apache每次访问后要记录日志的,数据库有人访问的话,也应该记录日志吧

数据库对数据的完整性来讲,要求非常严格的

银行转账 Bob少3000,Alice应该加上3000

所以数据库是不能出错的

换句话说   Bob少3000 Alice必须加上3000 ,否则不能让它执行


事务之间的隔离要完成 

有账户有3000,正在存5000,银行行长现在只能看到3000 


在众多管理软件当中,数据库管理软件是最复杂的一种,因为它背后所涉及到的概念,思考不比操作系统少


一个数据库管理软件应该具备的功能

RDBMS:

1,数据库的创建,删除,修改

2,创建表 删除表 修改库

3,索引的创建,删除

4,用户和权限的管理         (哪些用户只能访问哪些数据库,哪些表)

5,数据的增,删,改

6,数据的查询


操作数据库的命令分为三类

1,DML    Data Manipulation  Language            数据操作语言 (数据操纵语言)

                INSERT,REPLACE,UPDATE,DELETE

2,DDL     Data Defination Language    数据定义语言

                CREATE (创建数据库 创建表 创建索引等),ALTER,DROP

3,DCL     Data Control Language        数据控制语言

                GRANT (给用户授权)   REVOKE(取回 收回用户权限


4.DQL     数据库查询语言(马哥为什么没有这样的分类?)  SELECT


世界上第一款关系型数据库叫 egreSQL (好像是加州大学伯克利分校所研发的) 商业运行机制不如拉里·埃里森那么激进,不会做生意,使得egreSQL没落了,Oracle成长起来了,  egreSQL 表现特性很强大的

有开源组织者不甘心egreSQL没落,有人在它的基础上进行了二次研究,并且开源出来,就是PostgreSQL(后greSQL)

常见的RDBMS软件:        (十年前,十五年前,是三足鼎立) 这三个属于大型数据库

        Oracle     甚至比操作系统还复杂(很贵,一年授权下来,最便宜的十几万,多的达到百万) 但是Oracle本身功能强大,靠谱

                               仅仅是增强性能,满足当前需要,和最近一段时间的需要,竟争中大获全胜

        Sybase      Sybase公司的,苦苦挣扎求生     发展方向错,理念过于超前,着眼点不同     高端运用中,场景还是非常多的

        Infomix      Infomix公司的,已经被IBM收购了     发展方向错,理念过于超前,着眼点不同      高端运用中,场景还是非常多的


SQLServer 是 Sybase联合Microsoft(想开发数据库,可能实力不足) 开发的一种能够运行在Windows上的数据库软件,后来Sybase退出了,由Microsoft自己来维护了,更名为SQLServer (SQLServer 是Sybase的另外一个变种而已,早期的主流核心都是 Sybase 提供的 ,SQLServer 只能运行在Windows上,更重要的是性能,数据安全性保证都很一般) (把数据和关键性业务构建在Windows上,无疑拿自己的前途开玩笑)  ( SQLServer 开发本身是非常好的,只不过它依赖的系统太差了,所以它的运行导致太是太好  比起前三个,最多算一个中级(中型)的数据库)

数据库管理员(Database Administrator,简称DBA

早期有很多关系型数据库运行在开源的系统上,以开源的方式提供的 最流行的是MySQL PostgreSQL(psql pgsql) 

EnterpriseDB(有一家商业公司以企业级应用的视角,重新包装greSQL,就是 EnterpriseDB (企业级数据库) )

EnterpriseDB 所提供的特性正在向 Oracle靠近,授权费用大概是Oracle的1/4左右,也有免费的版本

红帽公司向 EnterpriseDB 注入了大量的资金,正在大力推广 EnterpriseDB


MySQL早期非常小,连SQL接口都没有,不能提供命令,没办法让终端用户手动去执行的,他们决定自己开发一个接口,

有个人跳槽出来,和另外两个人组建了一家公司,叫做 (后来叫做)MySQL AB,这家公司是瑞典的,AB就是有限责任公司

(SQL 就是结构化查询语言 My是一个作者的女儿的名字)

MySQL成熟的版本从3.23到后来的4.0 5.0 5.5 5.6 6.0的beta版出来的,一路发展而来,现在性能越来越强大,功能越来越完善)

Facebook goole 阿里巴巴 都是用的mysql,为什么不用Oracle(因为一,重量级,二,授权太贵,三,它是闭源的) 对于它们这样的

公司需要根据自己的需求,随时改架构的,所以他们要用开源的    这么大的公司都用Mysql,所以Mysql不算轻量级的吧

互联网公司一般用Mysql吧  早期淘宝用的也是Oracle 但是淘宝的王军搞了个去IOE化  IBM(ibm的小型机) Oracle  EMC(emc的存储设备,emc,世界级专业做存储设备的,做什么硬件,read,sun?,提供各种网络存储的提供商,非常贵,非常好)

(数据安全性很重要,业务很重要,不能中断了,所以Oracle数据放在EMC上,Oracle要运行,它需要大量的计算能力,它运行在IBM的小型机上) (去掉它们,靠一大堆计算机集群,一大堆的Linux,做成PC机的集群,来提供海量数据,支持海量的用户请求,然后把数据放在由众多背后的PC机组成的存储集群上,存储集群上运行的是经过自己内部改写以后的MySQL,他们发现比原来的系统性能更强,它们还抗住了双11,一天成交多少亿的业务规模)

证券,银行一般用Oracle吧  


MySQL早些年非常有前途的关系型数据库软件,


Oracle,IBM,SUN,Microsoft 

IBM和SUN被称为综合软件服务提供商,它们一条线,从硬件到软件到操作系统都能提供

(比如IBM小型机,操作系统用Aix,cpu也能自己生产,硬件,主板什么东西都能生产,到数据库软件DB2)


其实关系型数据库理论都是IBM的研究员所研发的,当时IBM己经有层次型数据库和网状数据库解决方案,

IBM反应慢,那个时候Oracle快速成长起来,IBM急急忙忙研发DB2,发现Oracle已经成长起来,打压不下去了

在拉里·埃里森的领导下,Oracle的销售策略非常激进,有攻击性,以致于IBM后来卖Oracle的软件

所以技术好不如卖得好,学得再好,没有雇用你也不行, 技术是燃料,市场才是发动机,

SUN 的硬件,工作站,非常有名,80年代卖得非常火,sun生产CPU,斯坦福大学提供的架构,生产的cpu叫spark,

sun有自己的操作系统叫 sevarris? sun就是没有自己的数据库,sun有java,  2008年10亿美元买了Mysql,SUN

技术非常牛,但是市场方面屡屡失策,但是财务状况很糟糕,Mysql没有迅速变现,后来Sun被Oracle收购了(67亿美元卖给了Oracle) Oracle此时可以跟IBM抗衡了

        Oracle 红色的

        IBM 蓝色巨人

红蓝两个阵营已成对抗之势,在苹果成长之前,Oracle最有钱,铁公鸡,不分红,后来,到处买公司,扬言在2012年要买数百家公司,

买了 BEA: Weblogic公司(83亿美元)

买了PeopleSoft 这是另外一家提供客户关系软件的公司(好像128亿美元)

拉里·埃里森买公司后不是为了发展壮大,买竞争对手,然后砍了,然后打入冷宫,再也不研发,再也不提供服务了,

以后,客户就用我的了,,,,不用我的,就没有服务了,所以他买的是市场,

所以Mysql怎么办?

所以当Oracle刚收购Sun的时候,至少Mysql的源作者是持反对意见的,整个欧盟持反对意见的,因为人家不想看到Oracle一家独大,成为垄断企业  欧美对这个其实是反对的,中国不是的

Oracle承诺5年之内不会对Mysql下刀.还对Mysql注入很多的技术实力和财务实力,所以sun被Oracle收购后,

头一年,头两年,拉里·埃里森还不错,第二年Mysql很多技术被私有化了,而且提高了Mysql商业版的授权(本来Mysql基本版好像一年500美元左右,拉里尔森直接提高到2000美元,把1000的提高到5000,把2000的提高到10000,)如果Mysql价格与Oracle价格差不多,人家用Mysql的热情就不高了   好在Mysql还有开源版,只不过已经过去3年了,不用担心学Mysql没用,

Sun很多产品都是开源的,还有一个产品叫Openoffice,跟windows的office套件一样的办公套件,拉里尔森立马把openoffice想变现,所以私有化,商业授权,      Openoffice的源作者不乐意,本来源作者以开源的方式授权的,所以源作者在早期原始分支的基础上又起了一个分支叫Libreoffice,而且 Libreoffice 比 Openoffice在性能上更先进,所以openoffice 没有人买了,所以前途很危险了,所以拉里·埃里森还把Openoffice开源了,交给开源组织,但是开源组织不要了,以后都用 Libreoffice 了,这就是拉里尔森的前科,他是十恶不赦的商人

Mysql的源作者已经看到危机了,所以他们利用早些年开源版本的Mysql,重新启用了另外一个开源分支叫 MariaDB

Maria 是他第三个女儿的名字,

马哥的英文名 Marion

MariaDB与Mysql完全兼容,而且MariaDB所提供的很多特性不比Mysql差,将来没有Mysql用的时候,可以用MariaDB

为什么不学 MariaDB ,因为目前Mysql没有危险性,众多公司(90%)还是用的Mysql

Sun虽然在卖Mysql,但是不是很赚钱,因为有另外一家公司,叫Percona, Percona 组织了一大帮程序员,对Mysql进行各种优化和改进,改进后重新发布叫 Percona sql(Percona版的 Mysql)(Percona Server) ,这个经过优化的Mysql,比原来的Mysql官方版本性能好很多,更重要的是人家不收钱,人家只是卖服务的,(有问题帮你有偿咨询服务)

Mysql 有些软件是商业的,比如备份软件,授权非常贵,一个服务器一年的使用费5000美元,

Percona 实现了跟 Mysql一样的软件,比它的性能,功能还强大,开源了,

所以Mysql被Oracle收购后,版本变得非常快,5.0 ..........5.4..........一直在更新版本,因为Percona 太牛了,没法与Percona 竞争,所以不停地提供新版本,新改进,新性能,试图拖垮 Percona 


学Mysql时,需要关注的一个重要的组织是 Percona  它提供了众多关于Mysql的优化的建议手段途径文章


由此可见,其实Mysql是一个非常好的关系型数据库

对于一个信息系统来讲,数据库管理系统就相当于人的心脏,它负责把数据(血液)输送到身体的各个地方,整个信息的各个位置上去,

管理信息系统核心:管理关系型数据库管理系统,再核心就是管理数据,


关系型数据库设计本身定义了很多规范,范式,这些范式极大的束缚了关系型数据库,使得关系型数据库一次查询(可能定义为了尽可能满足范式,数据库设计的时候,为了尽可能的降低冗余度,使得它分成了n个表,)将来发起一个大的查询的时候,必须要把多个表关联起来才能查询,而且表的关联需要在内存中完成,那就意味着我们需要把数据从磁盘读入内存,连接起来才能完成查询,所以非常慢

于是现在的数据库设计开始反关系化,这就叫去关系型,反关系型

反关系型模型:不再满足关系型数据库的特性了, 所以叫非关系型数据库

叫  NoSQL

它们不需满足于关系模型的处理,而是根据业务处理的需要,关注性能,关注读写性能,

当然它们也在一定程度上满足数据管理方面的一些需求

NoSQL只是一种技术,它不是一个软件,

能够提供NoSQL的软件有很多,而且大家的关注点也不一样

MongoDB 文档数据库

Redis 缓存数据库 (内存数据库)

HBase 这是一个能够实现在自我内部实现数据管理的一个非关系型数据库 既不是文档,也不是Redis,而是一个稀疏的基于键值对的数据库,很独特

这三款软件用得来讲都比较多

以后讲到 hadoop的时候,必须讲到HBase的使用,至少拿一个非关系型数据库来讲,它怎么用



普通分类: