Mysql及数据库的基础概念

DBMS:数据库管理系统数据库

  1. 层次模型缓存

  2. 网状模型安全

  3. 关系模型bash


RDBMS:关系型数据库管理系统服务器


文件存储:数据的冗余和不一致性难以解决多线程

      当数据量很大时,文件存储的访问很困难架构

      当数据在不一样的文件时,可能会形成数据的格式不一致,及数据太过于分散形成数据孤立并发

      数据的完整性问题(如两个银行之间转钱过程当中出现故障,要保证总额一致)ide

      并发访问异常(如多人同时访问一个文件时,一我的在进行修改操做,其余人就不能访问)函数

      原子性问题(数据从一个稳定状态转移到另外一个状态)

      安全性也得不到保障


    

1.表示层:文件或者表


2.逻辑层:文件系统或者存储引擎

  负责将底层的数据块抽象为文件供用户查看;而在存储数据时要靠文件系统将数据解构为物理层的数据(即完成从表示层到物理层的映射)


3.物理层:数据块,元数据


存储引擎:能够将文件系统理解文存储引擎,将不一样的格式的数据转换为表示层的文件,还能将文件存储为物理数据。这两个过程的完成都要由存储引擎来完成



关系:能够将关系理解为一张表


属性:表中每个列描述一个属性


实体:表中的每一行为一个实体(记录)


而整个表就是同一类实体的集合


E-R关系模型(即实体关系模型):将一个表拆分为多个表(实体),下降数据的冗余度


可以实现存储在关系型数据库中的关系模型有四种:

关系模型(结构化的数据模型):它的每一个字段都是有相同属性的,如第一列为Name,第二列为Passwd

      1.关系模型:靠一张二维表存储数据,

      2.实体关系型:将表拆分红多个不一样的实体,让实体之间经过不一样的约束创建联系

      3.对象关系型模型:基于对象的数据类型

      如:将一个很大的数据(如图片)存储在数据管理系统的某个空间上,并在表中用一个指针指向这个数据的存储地址,将其基于对象进行管理

    

      4.半结构化数据模型:在同一个表中每一行表示的数据可能不同;如

      Name:Age:Gender

      Name:UID:Birthdate

半结构化数据模型:在存储时既要把数据存储下来还要把数据定义的结构存储下来,以XML(扩展标记语言)格式进行存储


<name>Jerry</name>

 <age>50</age>

 gender:


而如今大多数的商业或者开源的关系型数据管理系统都能有效的处理以上四种数据模型


关系:代数运算(如求交集、并集、补集等等)


约束:如填入一个230的年龄数据库必需要能检测出来

   域约束:数据类型约束,如必须填入int,填入char错误

   外键约束:引用完整性约束。一个表中的字段必须与另外一个表中的字段相同而且其值要一一对应

   主键约束:某字段(或多个字段组合)能惟一标识此行的实体

  注:任意两个实体在主键上不能出现相同值,而且不能为空

   如/etc/passwd 中的uid不一样则能够做为主键、Name不一样也能够做为主键

   惟一性约束:没一行的某字段都不容许出现相同的值,能够为空,且能够有多个


  注:因此一个表中只能有一个主键约束,但能够有多个惟一性约束

  

   检查性约束:如age<100,age>0

  注:MySQL对检查性约束支持不强,但SQL—Server和Oracle支持较好

数据库语言:


SQL(Structure Query Language):结构化查询语言

DML:数据操做语言(增、删、查、改)insert、delete、select、update


DDL:数据定义语言

  定义RDB(数据库对象):库、表、索引、视图、用户。存储过程、存储函数、触发器、事件调度器

  Crete、Drop、Alter


DCL:数据控制语言,用来定义数据库中用户的访问权限


查询管理器功能:负责接收用户的查询、理解用户查询、并将用户的查询转换为对应的存储管理器能够理解的语言、而且要可以将数据在磁盘上存储或者删除


查询管理器组件:

DML解释器

DDL解释器

查询执行引擎


存储管理器组件:

权限及完整性管理器

事务管理器(保证事务的完整性、原子性等)

文件管理器

缓冲区管理器(数据查询存储要先将数据缓存再内存中,缓冲区管理器用来管理缓存空间,如缓存哪些数据)



MySQL:单进程多线程模型

    通常来讲MySQL会为每一个用户的请求生成一个线程进行请求的响应,意味着一个用户的全部操做(增、删、查、改等)都在同一个线程中完成

    

MySQL的线程分为:守护线程、应用线程


注:一般来讲每一个查询请求都要消耗大量的内存(如一个大的查询可能要涉及到1G的数据量都有可能,而在32位系统上一个进程最多只能使用2.7G的内存),因此MySQL的并发能力并非想象中的那么大。因此在一个集群中数据库服务器可能会是整个系统中最慢的一个节点,所以要尽可能避免与数据库的交互操做



那么如何避免与数据库的交互或者提升数据库服务器的性能?


1.将第一次查询的结果保存在缓存服务器中(varnish、memcache),当之后有相同的查询请求时直接在缓存服务器中找


2.线程复用:如DisCuz论坛同一个用户可能会每隔一段时间发一个帖子,而每次发帖对数据库服务器来讲都是一个新的请求,每次都要建立删除线程太麻烦,能够将线程实现屡次利用


3.使用性能好的服务器且OS为64位


且MySQL对SMP(对称多处理器)架构的cpu支持不好,MySQL能够将多个查询在不一样CPU上处理,但不能讲一个大的查询分开在多个cpu上同时运行,即一个单独语句只能在一个cpu上运行,这是MySQL不如orcale的一个很重要的缘由(即扩展性不行),可是能够将每一个MySQL的功能作的简单点,一个服务器只处理一点功能,作一个MySQL集群,这样能够有效解决这个问题


关系运算:

  1. 投影 只输出某个字段或者某个属性

  2. 选择 只输出符合条件的行

  3. 天然选择 在两张表的对应字段经过等值关系创建的链接叫作天然链接


表1

A 1
B 2
C 1
D 3


表2

1 bash
2 csh
3 zsh
4 ksh
5 tcsh


天然链接后

A 1 1 bash
B 1 1 bash
C 3 3 zsh
D 2 2 csh


4.笛卡尔乘积


(a+b)*(c+d)=ac+ad+bc+bd


表1中每行与表2中每行分别链接=4*5=20行

一般笛卡尔乘积查找很慢,应尽可能避免


5.并


表1中一行 + 表2中一行 ==新的一行



MySQL的结构组成


wKiom1iduS-xNec9AAJekQjdWdc101.png



表管理器:负责建立、读取或修改表定义文件;维护表描述符高速缓存;管理表锁;

表结构定义文件


表修改模块:表建立、删除、重命名、移除、更新或插入之类的操做;

表维护模块:检查、修改、备份、恢复、优化(碎片整理)及解析;


缓冲区管理器:有缓存置换策略,通常来讲内存远远小于Disk,因此当操做涉及的数据量大于内存时,缓冲区管理器要按照缓存策略(如最近最少使用策略)进行数据块的加载,移除等操做


数据在磁盘上的存储:磁盘为块型设备,数据以块(block)为但为单位进行存储,在进行数据的读取(I/O操做)时也只能以块为单位进行操做;而不能像字符型设备那样直接进行按需求读取所需的字符


而一个块中每每保存着多个行(若是数据不是很大),若是将其中的某个行删除,长时间下来会差生大量的数据缝隙,进而致使存储空间的浪费,那么如何利于数据缝隙?


每一个块都有一个块头,通常有存储引擎进行数据块的管理,块头里面记录了保存有多少行,即哪里是空白的,从而块头能够方便的对磁盘进行数据整理,进而避免碎片的产生


块头(记录了此块中保存多少行,哪些未保存)
缝隙(删除致使的)
数据1
缝隙
数据2


数据的记录组织:

  1. 堆文件组织,数据能够保存在文件中的任意一个位置;有利于存储,不利于查找

  2. 顺序文件组织,数据按照“搜索码”进行顺序存储;不利于存储,每次数据更新要从新排序,但有利于查找

  3. 散列文件存储,数据的某个字段进行散列运算(hash运算,如取余)而后根据不一样的结果保存在不一样的桶中

  4. 指针存储,每行数据在存储时还要记录下一行的指针,这样就不用按照顺序进行存储




表空间:将多个表的数据存放在同一个表空间中,标空间至关于一个更高级的数据存储空间


数据字典:表、视图等关系的元数据;如关系的名字、字段名称、字段类型、字段长度、用户名字、受权、密码等

相关文章
相关标签/搜索